안녕하세요, 제 이름은 Mark입니다.
저는 수년동안 Unity같은 소프트웨어를 이용하여
게임을 만들고 싶었습니다. Unity는 "컵헤드" ,"네온 화이트",
"튜닉";
"아우터 와일즈", "하스스톤", "파이어워치",
심지어 포켓몬 다이다몬드 리메이크에도 사용되었습니다.
그런데 저는 항상 긴 튜토리얼 영상을 볼 때마다 잠이 오더군요
전 다른 사람이 하는걸 보면서 따라하는 것보다
직접 시도해보는게 적성에 더 맞더라고요
그래서 작년에 3단계로 구성된 해결법을 만들었는데,
꽤 효과가 좋았습니다
1. Unity의 기본'만' 배우기,
2. 간단한 시험으로 기본 익히기,
3. 나머지는 게임을 만들면서 알아서 배우기.
제가 해봤더니 정말로 되더군요!
다른 모바일 게임을 배끼는 것부터 시작해서,
자석을 이용한 저만의 퍼즐 플랫포머 게임을;
만들기까지 1년정도 걸렸습니다
그런데 Unity같이 복잡한 소프트웨어의 기본을
어떻게 배워야 하는지
의문점이 들겁니다
저는 대부분의 게임의 들어가는
공통적인 요소를 리스트로 만들었습니다
캐릭터를 화면에 띄우는 방법;
캐릭터를 움직이게 하는 방법,
뭔갈 생성하거나 없애는 방법;
캐릭터의 판정, 게임 오버, 애니매이션, 사운드 등등;
전 이 방법들을
긴 튜토리얼 영상, Unity 문서;
검색, 그리고 수많은 시행착오를 겪으면서 배웠습니다
이 영상의 목적은 여러분이 그걸 겪지 않게 만드는 것입니다
이 영상은 제가 Unity를 배울 적에 봤다면
좋았을 영상입니다
앞으로 40분동안 우리는 Unity를 이용해
플래피 버드를 만들겁니다
플래피 버드를 만들고 싶어서가 아니라,
플래피 버드를 만들려면
제가 아까 말한 요소인 뭔갈 생성하는 것부터
게임 오버까지 전부 필요하기 때문입니다
이 튜토리얼에서는 Unity 설치부터 UI 이해;
프로그래밍, 그리고 당신의 지인들과 공유할 수 있도록
게임을 빌드하는 것까지 배우게 됩니다
그리고 튜토리얼이 끝난 후, 간단한 시험을 통해
기본을 익히게 되고,
그 후로는 스스로 배우는게 가능해질겁니다
괜찮은 것 같나요? 그렇다면 이제 시작하죠.
Unity를 다운받는 것부터 시작합시다.
다운로드 후 Unity Hub를 설치하세요
Unity를 사용하려면 계정이 필요합니다.
계정을 만든 후,
Unity 에디터 설치 창이 나올겁니다.
설치하세요
*(이 영상에선 2021.3을 사용했지만,
2022를 사용해도 상관없습니다)
*(설치 시 약 15분정도 걸립니다
너무 오래 걸리면, Unity Hub를 관리자 권한으로 실행해보세요)
아직 끝난게 아닙니다. 옆에 톱니바퀴 아이콘을 누르고 모듈을 누르면
Visual Studio가 체크되어있는게 보일겁니다
저희는 이 프로그램으로
코드를 작성할 겁니다
Visual Studio를 설치한 후, 이 화면에서
아래로 스크롤하고
"Unity를 활용한 게임 개발"은 체크하고, Unity Hub는 해제합니다
왜냐면 Hub는 이미 설치 되있으니까요.
Visual Studio는 계정이 필요없으니 이건 스킵하고,
어차피 나중에 열거니 이 창은 닫아도 됩니다
이제 Unity Hub에서 '새 프로젝트'를 누르고,
'모든 템플릿'을 선택하고 '2D 코어'를 선택합니다
'2D 코어'는 2D 게임을 만드는데 적합한
빈 프로젝트입니다
이름을 정하고, '프로젝트 생성' 버튼을 누르세요
첫번째로, 우리는 Unity의 UI를 배울겁니다
다른 패널들을 탐방하면서, 화면에 새를 띄울겁니다
이게 Unity의 기본 레이아웃입니다
4개의 패널로 나뉘어져 있죠
아래에는 프로젝트 패널이 있습니다
여기에는 게임에 들어가는 모든 요소가 포함됩니다
예를 들면 스프라이트, 사운드, 스크립트, 타일, 폰트 등이 있습니다
이중 일부는 Unity에서 직접 만들거지만
다른 곳에서 파일을 드래그해도 됩니다
저는 포토샵에서 새와 파이프의 스프라이트를 만든 후
이걸 프로젝트에 드래그했습니다
전 여러분이 스프라이트를 직접 만들면 좋겠지만
만약 그림을 잘 못그리겠다면
설명에 에셋 다운로드 링크를 확인하세요
왼쪽에는 계층 구조 패널이 있습니다
여기에는 현재 '장면'에 있는 것들이 포함되며
'장면'은 대부분의 게임에서 레벨의 역할을 합니다.
우선 새를 만드는 것부터 시작합시다
계층 구조에서 빈 오브젝트 생성을 누르면
빈 GameObject가 생성됩니다
GameObject는 투명한 컨테이너와 같습니다
위치를 지정하거나 회전할 수 있고;
크기를 조절할수도 있습니다. 그리고
컨테이너 안에 컴포넌트를 넣어 기능을 추가할 수 있죠
예를 들어, '스프라이트 렌더러' 컴포넌트를 넣으면
GameObject에 이미지를 넣을 수 있죠
이 게임의 모든 것들은 '컴포넌트가 있는 GameObject'로
구성되어 있습니다
새, 파이프, 심지어 UI와 카메라까지
이 모든 것들은 오른쪽의 인스펙터에서 관리할 수 있습니다
빈 GameObject를 선택한 후, 위에서 이름을 정할 수 있습니다
이름은 그냥 Bird라고 하죠
그리고 Transform에서 위치, 기울기, 크기를 조절할 수 있습니다
이제 '컴포넌트 추가'를 누르고, Rendering을 누르고
Sprite Renderer를 선택하세요
이걸 작동하게 하려면, 스프라이트를 선택해야 하는데,
그냥 프로젝트 패널에서 새 이미지를
빈칸에 드래그하면, 그래픽이 생겼네요!
그래픽은 중앙에 있는 씬 패널에 나타납니다
씬에서는 현재 씬에 무엇이 있는지 볼 수 있고,
이 기능들을 이용하여 움직이거나 회전시킬 수 있습니다
이 섹션에는 '게임'이라는 탭이 있는데,
여기선 게임을 실행할때 메인 카메라에서
어떻게 보이는지 확인할 수 있습니다
그리고 여기에선 해상도나 화면비를 설정할 수 있습니다
다른 화면에서 어떻게 보이는지 알 수 있죠
- 저는 1920x1080을 선택하겠습니다
새가 너무 많은 공간을 차지하네요
새의 크기를 줄일 수도 있지만, 저희는
카메라를 축소할 겁니다. 카메라 또한
계층 구조에 있는 GameObject이기에 이를 선택하면
Camera 컴포넌트에서 수치를 조절할 수 있습니다
'크기'를 높이면 카메라가 축소됩니다
그리고 배경 색도 바꾸겠습니다.
좋네요
이제 위에 있는 Play 버튼을 누르면
세상에서 가장
지루한 게임이 시작됩니다
네. 이제 덜 지루하게 만들어 보죠
잠깐 되돌아봅시다
Unity에는 4개의 패널이 있고 그중 프로젝트에는 모든 요소가 들어가고,
계층 구조에는 현재 레벨에 있는 GameObject가 표시되고,
인스펙터에는
GameObject를 마음대로 조절할 수 있고,
씬에서는 레벨을 볼 수 있다.
그리고 GameObject는 Sprite Renderer같은
컴포넌트를 담을 수 있는 투명한 컨테이너다.
두번째로, 저희는 더 많은 컴포넌트를 이용하여
새를 중력에 영향을 받는 물리 오브젝트로 만들고
코드를 이용하여 스페이스 바를 누를 떄마다
새를 위로 날게 만들겁니다
이제 새에다가 Rigidbody2D 컴포넌트를 추가합시다.
이 컴포넌트는 새를 물리 오브젝트로 만들어 줍니다.
그래서 Play 버튼을 누르면 새가 화면 밖으로 떨어집니다.
이 새가 다른 오브젝트와 상호작용하게 만들려면
Collider가 필요합니다
Circle Collider 2D를 추가합시다
씬을 보면 초록색으로 된 선이 보입니다
중심이 약간 안맞기 때문에;
오프셋을 조절해서 움직이겠습니다
여기서 게임 디자인 팁을 주자면
Collider(판정)를 이미지보다 조금 작게 만들면
플레이어가 파이프에 아주 살짝 닿았더라도
게임 오버가 되지 않기에
빡센 느낌이 줄어들게 됩니다
마지막으로, 스크립트를 추가하겠습니다
스크립트를 활용하면 사실상 나만의 컴포넌트를
만들 수 있게 되지만, 우리가 코드를 이용해서 직접 만들어야 합니다
컴포넌트 추가에서 New Script를 선택하고,
이름은 BirdScript라고 하겠습니다.
만든 후, 스크립트를 더블클릭하면
전에 설치한 Visual Studio가 열릴겁니다
프로그래밍의 세계에 온걸 환영합니다!
너무 무섭게 생각하지 마세요;
천천히 설명해드릴 겁니다.
저희는 C#으로 코드를 작성할겁니다
먼저 Start와 Update, 이 2개에 대해
알아보겠습니다
Start는 (이 스크립트가 활성화 돼있으면) 처음으로 실행되는 코드이고,
단 한번만 실행됩니다.
Update는 (이 스크립트가 활성화 돼있으면) 항상 실행되는 코드이고,
매 프레임마다 코드가 실행됩니다.
아무튼, 저희가 코드로 작성할 건
- Unity로 다시 돌아가보면
컴포넌트에 있는 숫자들이나 텍스트를 마음대로 조절할 수 있죠
저희는 코드를 이용하여
게임이 실행되는 동안 이것들을 조절할 겁니다
간단한 예시를 들자면
Start에 gameObject(오른쪽 위에 있는걸 의미함)를 치고,
점[.]을 치면 리스트가 보일겁니다
*(리스트가 안보이면, Unity 위에 '창'->'패키지 관리자'->아래로 내려서 'Visual Studio Editor' 선택 후 설치
그후 Unity 위에 '편집'->'환경 설정'->'외부 툴'->Visual Studio 선택 후 전부 체크하고 재실행)
이중 대부분은 인스펙터에 있는걸 나타냅니다
예를 들면 정적(isStatic);
태그, 레이어, 이름이 있죠
name을 선택하고, [=] 쓰고, 큰따옴표[" "]로
새의 이름을 넣으면 됩니다.
마지막으로, 명령 끝엔 항상 세미콜론[;]이 있어야 합니다
그리고 스크립트를 저장하는것도 잊지 마세요
이제 게임을 실행하면... GameObject의 이름이
바뀌였네요. 좋습니다
네, 이제 그 코드는 지우세요.
방금 쓴 코드는 우리가 코드로
게임과 대화할 수 있다는 걸 알려줍니다
저희는 코드를 작성하여 누구와 대화할지
대상을 정할 수 있고, 대화의 주제도 정하고,
그 후 명령을 정할 수 있습니다
저희는 이 짓을 많이 하게 될겁니다.
아무튼 저희가 진짜로 해야할 일은,
Rigidbody2D 컴포넌트에서 Info 아래에 보면
Velocity가 회색으로 표시된게 보일겁니다
저희는 위쪽으로 Velocity를 주는 코드를 작성해서
새가 하늘로 날 수 있게 만들겁니다
문제는, 이 스크립트는 GameObject의
윗부분과 Transform끼리만 대화할 수 있고
다른 컴포넌트의 존재도 모릅니다
그래서 이 스크립트에 RigidBody2D를 위한 공간을 만들어야 합니다
그러면 대화를 할 수 있게 되고 명령을 보낼 수 있게 되며
이를 '레퍼런스'라 부릅니다
Class와 Start 사이에 레퍼런스를 작성할 겁니다:
public RigidBody2D myRigidBody;
이제 RigidBody2D를 보관할 공간이 생겼고,
다른 Rigidbody2D와 구분하기 위해
공간의 이름도 정했습니다
public으로 정했기 때문에 스크립트 밖에서도
공간을 건드릴 수 있습니다
저장하고 Unity로 돌아가면, 스크립트 컴포넌트에
RigidBody2D를 위한 공간이 생긴걸 볼 수 있습니다
이제 RigidBody2D 컴포넌트를 빈칸에 드래그하면,
이제 스크립트와 RigidBody간의 통신선이 생겼습니다.
다시 Visual Studio로 돌아와서, Update에
myRigidBody 그리고 점[.]을 치면
이 많은 대화 주제들을 보세요
angularDrag, gravityScale, mass;
이것들이 전부 RigidBody2D에 있는 속성들입니다
우리가 원하는건 velocity죠
전에 했던 것처럼 [=]을 쓰고,
여기에서는 Vector라는 2D 공간에서 위치를 나타내는
값을 이용할 겁니다
여기서 Vector는 새가 나는 방향을 나타내는데 사용할겁니다
저희는 새가 위로 나는걸 원하기 때문에,
(0,1)이 좋겠네요. 저는 Vector2.up을 이용할 겁니다
*Vector2.up은 Vector2(0,1)과 같은 의미입니다
그리고 힘을 주려면
Vector에 힘을 곱하면 됩니다
힘은 대충 10 정도면 충분할 겁니다
그리고, 전에 말했지만, Update 안에 있는 코드는
매 프레임마다 실행되기 때문에
저장하고 플레이 해보면... 영원히 날아갑니다
하지만 저희가 원하는건 스페이스 바를 누를 때만
새가 날아가게 하는 것이죠
이제 프로그래밍에서 가장 중요한 요소를 사용할 때입니다:
바로 if 입니다.
if는 마치 검문소와도 같습니다
게임이 특정 조건을 만족하지 못한다면,
매 프레임마다 그 코드는 완전히 무시됩니다
반대로, 검문소에 적혀 있는 특정 조건을 만족한다면,
통과할 수 있게 되고 코드가 실행됩니다.
저희가 원하는건 "만약 플레이어가 스페이스 바를 누르면,
위쪽으로 velocity를 더한다"죠
if를 적고 괄호 안에 조건을 적으면 됩니다
여기서는 컴포넌트와 대화하는게 아니라 Unity와 대화하게 됩니다
정확히는 Unity의 인풋 시스템이죠
Input.GetKeyDown, 그리고 괄호 안에 KeyCode.Space