2-1. Script Basic

모바일 디펜스 게임으로 배우는 Unity 기초 강좌의 맛보기 강의입니다.

강의 대본 보기

지난 시간까지 object 및 component의 개념과 Unity에서 활용되는 다양한 뷰에 대해서 개괄적인 내용을 다뤄보는 시간을 가져보았습니다. 아마 component를 이용해 캐릭터와 같은 어떠한 object들의 위치를 바꾸거나 어떤 기능을 부여하는 게 가능하다는 것은 이해를 하셨을 거예요. 그렇다면 실제 게임에서처럼 사용자로부터 방향키 입력을 받아서 위치를 이동시키는 등의 작업을 하고 싶다면 어떻게 해야 될까요? 이때 필요한 것이 바로 스크립트입니다. 즉, component를 원하는 대로 움직이고 만들고자 한다면 스크립트를 작성해서 사용할 수가 있어요. 스크립트란, 간단하게 말하자면 게임에서 다양한 연산을 처리할 수 있도록 해주는 소스 코드라는 의미를 가지고 있어요. 즉, 스크립트는 물리적인 object의 동작을 제어하거나 그래픽 효과를 위해 사용할 수도 있고요. 심지어 몬스터의 인공지능을 구축할 때도 사용할 수 있답니다. Unity에서 기본적으로 제공하는 component, 즉 지난 시간까지 다루었던 Sprite Renderer나 Rigidbody 2D 등도 물론 있지만 우리가 원하는 기능을 직접 구현하기 위해서는 이렇게 스크립트를 작성해서 자신만의 component를 만들어야 할 필요도 있습니다. 스크립트는 일반적으로 프로젝트 내에 별도의 폴더를 생성해서 관리합니다. Project View에 Assets 폴더 내에 스크립트 폴더를 생성해볼게요. 이제 스크립트 폴더에 들어가셔서 우 클릭을 하시고 Create, C# Script로 하나의 스크립트를 만들어보도록 할게요. 이때 우리가 처음으로 만들어볼 스크립트는 특정한 object의 정보를 보여준다는 의미에서 ShowInformation이라고 스크립트의 이름을 지어보도록 할게요. 이렇게 ShowInformation이라고 지어주시고 이렇게 파일을 생성한 이후에 스크립트 파일을 더블 클릭하면 Unity를 설치할 때 선택했었던 마이크로소프트 Visual Studio가 실행이 되는 것을 확인할 수 있어요. 이제 이 부분이 바로 Unity 2018년도 버전부터 차이가 나는 부분인데요. 2018년도 버전의 이전 버전, 그러니까 2017년 버전 등에서까지 MonoDevelop이라는 개발환경을 Unity가 자체적으로 지원을 했었어요. 그러나 2018년도 버전부터는 MonoDevelop을 지원하지 않기 때문에 만약 이전 버전을 가지고 강의를 듣고 계시던 분들은 가능한 한 2018버전으로 Unity를 다시 설치하셔서 Visual Studio로 따라와 주시기를 강하게 권장을 드릴게요. 개발환경의 개념이 정확히 없으신 분들을 위해서 간단히 설명을 드리자면 일종의 스크립트 작성을 편하게 하도록 도와주는 툴이라고 이해를 하시면 될 것 같아요. 이러한 Visual Studio는 C# 뿐만 아니라 다양한 응용 프로그램 개발을 할 때 사용할 수 있기 때문에 매우 강력한 프로그래밍 개발환경이라고 할 수 있습니다. 또한 저 같은 경우는 이미 Visual Studio를 사용하고 있기 때문에 이렇게 바로 오픈이 되는 걸 알 수가 있는데요. 아마 처음 오픈하시는 분들은 테마 설정 같은 것도 하시게 될 거예요. 저 같은 경우는 뒤에서 볼 때 조금 간지가 나 보이는 이 검은색 테마로 설정을 했었는데요. 물론 농담입니다. 이렇게 밝은 테마를 할 때보다 검은색 테마를 사용할 때 조금 더 장시간 작업할 때 눈이 덜 아플 수 있기 때문에 저는 이렇게 검은 테마를 사용하고 있어요. 이제 여기에서 자유롭게 스크립트를 작성할 수 있습니다. Unity는 크게 두 개의 프로그래밍 언어를 지원하는데요. 하나는 C# 스크립트고 방금 우리가 만들었던 게 C#스크립트예요. 즉, 프로그래밍 언어가 C#이고 C#이라는 언어를 이용해서 어떠한 프로그램을 작성한 게 바로 C# 스크립트라고 할 수 있는 거예요. C# 스크립트 이외에도 Unity 스크립트라고 해서 자바 스크립트라는 프로그래밍 언어를 기반으로 해서 코드가 더욱 간결하다는 특징이 있는 언어가 존재하는데요. 하지만 일반적으로 더 체계적인 프로그래밍을 위해서 C#이 가장 많이 사용이 되고 있다는 점에서 우리의 강의에서도 이렇게 C# 스크립트를 기준으로 스크립트를 작성하려고 합니다. 이런 식으로 여기에서 언어를 작성할 수 있는데요. 한번 이렇게 Scene View로 가서 ShowInformation component를 기존에 존재하는 Monster object에 이렇게 드래그 앤 드롭을 해보도록 하겠습니다. 그러면 이 Monster object에 ShowInformation component가 추가된 것을 확인할 수 있는데요. 이 방법 말고도, 사실 Monster object를 눌러서 Add Component를 통해서 ShowInformation을 추가할 수도 있습니다. 아직은 스크립트를 작성하지 않아서 이 ShowInformation component를 object에 추가한 뒤에 실행을 해도 별다른 일이 일어나지 않지만 즉 이전 시간과 동일하게 작동을 하지만, 스크립트를 작성함에 따라서 이 object의 위치, 충돌 등의 데이터 처리를 체계적으로 수행할 수도 있습니다. 예전에 살펴본 object component에 대한 그림을 다시 한번 살펴보겠습니다. 이렇게 object와 component의 개념을 다시 한번 살펴보았을 때 여기에서 object에 해당하는 것은 지금 우리 Unity의 Monster겠고 여기에 추가한 component, 즉 지금까지 배워서 넣은 Rigidbody 2D 그리고 Sprite Renderer 그리고 방금 추가한 ShowInformation 스크립트 component도 전부 다 이렇게 component에 해당한다고 할 수 있어요. 개념을 명확하게 이해하는 것이 중요하기 때문에 이렇게 한 번 더 언급을 해드렸어요. 다시 이제 Visual Studio로 들어가셔서 아까 우리가 열어보았던 ShowInformation 스크립트 파일을 확인을 해보도록 할게요. 스크립트를 보시면 Start 함수와 Update 함수가 존재하는 것을 알 수 있습니다. Start 함수는 특정한 object에서 어떠한 초깃값들을 설정할 때 일반적으로 사용하고요. 예를 들어 게임이 시작되자마자 Monster object를 특정한 위치로 이동시킨다거나 하는 것들을 생각하시면 될 것 같아요. Update 같은 경우는 매 프레임마다 동작하는 하나의 함수라고 할 수 있어요. 흔히 초당 프레임 횟수를 FPS라고 하는데요. 만약 60FPS라면 초당 60번씩 이 Update 함수가 실행이 되는 거예요. 일반적인 게임들은 60FPS로 동작합니다. 예를 들어, 사용자가 공격키 A를 눌러서 캐릭터가 공격을 수행하는 등의 기능을 Update 함수 안에 작성을 하겠다고 가정을 해봅시다. 그러면 Update 함수는 작성이 된 소스 코드를 읽어서 1초에 60번씩 계속해서 물어보는 거예요. 너 지금 A 키 눌렀니? 만약 눌렀으면 공격을 수행하도록 하고 안 눌렀으면 그냥 무시하는 방식이겠죠. 한번 간단하게 테스트를 해보도록 할게요. 먼저 Start 함수에 Debug.Log라고 입력을 해서 괄호를 열어 주시고 "Start!"라고 한번 넣어주신 뒤에 괄호를 닫고 이렇게 세미 콜론을 넣어주도록 할게요. 세미 콜론 같은 경우는 일반적으로 우리의 키보드에서 엔터키 왼쪽에 있습니다. 이렇게 Debug. 한 다음에 Log라는 함수를 이용해서 "Start!"라고 출력을 시켜라 라고 간단하게 작성을 한 거고 나중에 더 자세하게 언급을 해드릴게요. 즉, 지금 당장 이 Debug.Log 이 한 줄, 한 줄의 그 의미를 기억하시기보다는 Debug.Log를 쓰시고 이렇게 괄호 안에, 큰따옴표 안에 어떠한 문자열을 쓰고 세미 콜론을 찍게 되면 그걸 화면에 출력할 수 있다는 것만 기억하시는 게 더 중요하다고 할 수 있어요. 아마 금방 익숙해지고 외우신 뒤에 따라오실 수 있을 거예요. 한번 이렇게 작성을 하신 뒤에는 코드를 저장하시면 됩니다. 저장하실 때는 Ctrl + S를 눌러서 저장을 할 수가 있어요. 혹은 이렇게 파일에서 Assets 폴더에 있는 스크립트 폴더에 있는 ShowInformation 파일을 저장할 것인지 이 버튼을 클릭해서 저장을 할 수도 있어요. 이렇게 해주신 뒤에 한번 우리의 Scene View, 그리고 Game View로 돌아가셔서 컨트롤과 p를 한꺼번에 눌러서 플레이를 해보도록 할게요. 플레이를 해보시면 이렇게 몬스터가 떨어지는 걸 볼 수 있을 거예요. 근데 이제 이게 중요한 게 아니라 Project View 오른쪽에 보시면 Console View가 있습니다. 이걸 눌러보시면 이렇게 콘솔 창에 로그가 찍히는 것을 알 수가 있어요. 로그란, 쉽게 말하여 특정한 프로그램이 동작하는 과정을 기록한 것이라고 할 수 있어요. 현재는 단순한 메시지를 기록했으나 실제 게임을 개발할 때는 각종 오류가 발생하는 것을 기록하고 관리하기 위한 목적으로 더 많이 사용됩니다. 이렇게 시작을 할 때마다 제대로 Start!라는 로그가 찍히는 것을 알 수 있습니다. 이번에는 소스 코드를 수정해서 처음 시작할 때, 참고로 시작할 때를 프로그래밍 용어로 initialization, 즉 초기화라고 말합니다. 즉, 어떻게 초기화를 시킬지를 결정하는 것을 initialize라고 하는데요. 이렇게 초기화가 프로그래밍 언어에서 어떠한 시작을 알리는 처리를 해주는 거다 라고 이해하시고 넘어가시는 것으로 충분할 것 같고요. 이렇게 Start 함수로 초기화를 할 때, 한번 안에 들어가는 내용을 바꾸어서 '스크립트 초기화'라고 내용을 바꾸어 넣어주도록 할게요. 이렇게 '스크립트 초기화'를 시작과 동시에 출력할 수 있도록 해주시고 이번에는 Update 함수를 건드려서 매 프레임마다 이 스크립트가 적용된, 이 component가 추가된 object의 이름을 출력하도록 해보겠습니다. 이제 여기에서 Update 함수 안에 간단하게 Debug.Log라고 이렇게 또 함수를 작성해 보도록 할게요. 이제 여기까지는 썼는데 현재 이 스크립트가 적용된 object 이름을 가져오고 싶은 거잖아요. 즉 그럴 때 쓰는 것이 바로 이 gameObject라는 이름의 변수입니다. 아직 변수에 대해서 공부를 하지 않았기 때문에 변수가 뭐냐? 이렇게 하지 마시고 변수에 대해서는 나중에 더 상세하게 설명해 드릴 거예요. 어쨌든 이렇게 Debug.Log한 다음에 안에 gameObject를 넣어주시고 이제 이 gameObject의 의미는 이 스크립트가 적용된 gameObject라는 뜻으로 이해하시면 돼요. 대소문자가 달라지면 안 되기 때문에 주의하시고요. 그런데 이 gameObject는 무수히 많은 속성들을 가지고 있겠죠? 지금까지 배운 Transform, 혹은 위치라든가 여러 가지가 있을 거예요. 그중에서 고른다는 의미로 온점을 이렇게 찍어 줍니다. 그다음에 gameObject의 어떠한 속성, 어떠한 정보를 불러올 건지 결정해야 돼요. gameObject의 이름을 가져오는 정보는 다행히 꽤 직관적으로 설정이 되어 있는데요. 이렇게 name이라고 쓰게 되면 이 한 줄의 의미는 이 component가 적용된 gameObject의 이름을 Console View에 출력해라가 되겠습니다. 이게 Update 함수에 있으니까 1초에 60번 정도 계속 이름이 나올 것을 예상할 수 있죠. 그런데 그냥 이름만 나오게 하면 심심하니까 코드를 약간 더 추가해서 "오브젝트 이름"이라고 이렇게 앞에 큰따옴표를 기준으로 문자열을 만들어 주시고 플러스를 추가해서 어떠한 문자열의 앞에 함께 출력이 되도록 만들어 줄게요. 이제 이렇게 해주신 뒤에 실행을 해보시면. 물론 스크립트 파일을 저장해두셔야 돼요. 이렇게 실행을 해보시면, Console View에서 맨 처음에 '스크립트 초기화'라고 출력이 되는 걸 알 수가 있고요. 그다음에 이렇게 프레임마다 계속해서 이름 값이 출력이 되는 것을 Console View에서 마찬가지로 확인할 수가 있어요. 다만 이렇게 오른쪽을 보시면 779라고 저는 나오네요. 이제 이게 출력된 횟수예요. 이제 Console View 같은 경우는 너무 많은 것들이 계속해서 출력되면 알아보기가 어렵기 때문에 만약에 동일한 문장이 출력되는 경우는 그 문장이 몇 번 출력되는지 오른쪽에 나오는 것을 알 수가 있어요. 즉, 스크립트 초기화는 단 한 번 출력이 되었기 때문에 이렇게 1이라고 나와 있고요. 이 object 이름이 Monster다. 이 내용은 779번이나 출력이 된 것을 알 수 있어요. 그도 그럴 것이 매 프레임마다 출력이 되었기 때문에 이렇게 많이 출력이 된 거라고 할 수 있겠죠. 이렇게 만약에 내용이 많아지거나 했을 땐 Clear 버튼을 눌러서 그 내용을 다 지워줄 수도 있고요. 또한 옆에 있는 Clear on Play 버튼을 체크해주시게 되면 플레이할 때마다 이 Console View에 찍히는 로그가 지워지는 것을 알 수가 있어요. 기본 설정은 이렇게 Clear on Play가 설정이 되어 있는 거고요. 마지막으로 스크립트에서 아주 중요한 개념 하나만 짚고 넘어가도록 할게요. 보시면 뭔지는 몰라도 public Class 뒤에 우리가 정한 스크립트 이름이 있는 게 보이실 거예요. 뒤에 MonoBehaviour 이것도 아직 모르셔도 되고요. 단, 여기서 아셔야 하는 건 이 Class 뒤에 있는 스크립트 이름을 바꾸게 되면, 이런 식으로 바꾸게 되면 이 Project View에 있는 스크립트 파일의 이름도 이에 맞춰서 바꿔야 한다는 거예요. 반대로 이 Project View에 있는 스크립트명을 바꾸다가 실행이 안 되는 경우도 종종 있으니까요. 파일명과 소스 코드 내에 이 클래스 명을 정확하게 일치시켜 주는 것을 반드시 기억하시기 바랍니다. ShowInformation이라는 이름이 이 파일 이름과 정확히 일치해야 돼요. 물론 기본적으로 우리가 스크립트 파일을 생성할 때 이름을 설정해 주면 이렇게 자동적으로 이름이 적용되기 때문에 아마 크게 많이 발견할 수 있는 오류는 아닐 거예요. 이상으로 기본적인 스크립트 작성 방법에 대해서 공부하는 시간을 가져보았습니다. 다음 시간에는 개발환경을 간단하게 세팅해보는 방법을 알아보는 시간을 가져보도록 할게요.

이 강좌의 맛보기 강의

모바일 디펜스 게임으로 배우는 Unity 기초
모바일 디펜스 게임으로 배우는 Unity 기초강좌 자세히 보기