전체 페이지뷰

2017년 9월 20일 수요일

Unity Tutorial: 2D Roguelike, part 1


Project Introduction



이번에 따라 만들어볼 게임은 턴 베이스, 타일 베이스의 생존게임입니다.


장애물과 적을 피해 음식을 구하는 슬픈 게임인 듯 합니다.

먼저 File>New Project하고(3D가 아닌 2D에 체크) 프로젝트를 만듭니다.
그리고 에셋 스토어를 방문하여 "2D Roguelike"를 검색합니다. 여느 때와 마찬가지로 다운로드해서 프로젝트로 임포트 합니다.


Player and Enemy Animations


플레이어와 적의 프리팹을 만드는 것으로 시작합니다.
Hierarchy에서 Create>Create Empty해서 빈 오브젝트를 하나 생성하고 이름을 Player로 정합니다.

Assets>Sprites 폴더에 보면 sprite sheet가 하나 들어 있습니다. 쉬트를 펼치명 캐릭터들의 그림이 주르륵 나타납니다.


그 중 처음 여섯 개의 그림만을 선택(첫 그림을 클릭하고 여섯번째 그림을 Shift+클릭) 드래그하여 생성했던 Player로 끌어다 놓습니다.

그러면 새로운 애니메이션이 생성되는데 이름을 PlayerIdle로 정합시다. 이 파일은 Sprites 폴더에 그대로 저장되는데 Assets>Animations>Animations 폴더를 만들고 그리로 가져다 놓습니다. 그와 동시에 Player라는 이름의 Animator Controller 파일도 생성되는데 이 파일은 Assets>Animations>AnimationControllers 라는 폴더를 만들어 그리로 옮겨 줍니다.





다시 스프라이트를 선택해서 아래로 내려보면 플레이어가 수도로 무언가를 내리치는 듯한 그림들이 있습니다.


저 두 그림을 선택하고 끌어서 다시 Player로 가져다 놓으면 또 하나의 애니메이션 파일이 생성되고, 역시 Assets>Animations>Animations 폴더에 PlayerChop 이라는 이름으로 저장합니다.

스프라이트의 더 하방으로 내려오면 플레이어가 주먹질을 하는 그림 두장이 있습니다. 이것들을 선택하여 드래그 하고 같은 폴더에 PlayerHit라는 이름으로 저장합니다.


이 상태에서 플레이를 눌러보면 플레이어가 서있는 모습이 표현되는데 동작이 조금 빠른 듯 합니다.

컨트롤러 편집을 위해 Player 인스펙터 창에서 컨트롤러 파일인 Player를 더블클릭 합니다.

그러면 Animator 편집 창이 뜨게 되고 그 중 PlayerIdle을 선택한 후 인스펙터 창을 보면 Speed라는 프로퍼티가 있는데, 그것을 1에서 0.5로 낮춥니다. 나머지 State 들은 나중에 스크립트로서 제어하게 될 것입니다.

다시 Player 오브젝트를 선택하고 인스펙터를 봅시다. Tag, Layer등을 다음 그림과 같이 변경합니다.



이제 이 플레이어에 Rigidbody 2D를 추가하고 Body Type 프로퍼티를 Kinematic으로 변경합니다. 그리고 Box Collider 2D 컴포넌트도 추가하고  Size 프로퍼티를 (0.9, 0.9)로 변경합니다.

(동영상이 4.6 버전 기준이라 지금과 제법 다르네요. 정확하게 하고 있는지는 모르겠지만 일단 따라가 보겠습니다)

Assets폴더에 prefabs 폴더를 생성하고 지금까지 만든 플레이어를 드래그하여 프리팹화 하고 Hierarchy에서는 지우겠습니다.

Player를 만들었으니 이제 Enemy 차례겠죠. 역시 빈 오브젝트를 하나 생성하고 이름은 Enemy1으로 정합니다.

Sprites 폴더로 가서 쉬트 6~11 까지의 6개를 선택하여 Enemy1에 드래그하고 이름은 Enemy1Idle로 정합니다.

그리고 생성된 애니메이션은 Assets>Animations>Animations로, 컨트롤러는 Assets>Animations>AnimationControllers에 넣습니다.

같은 방식으로 Sprites 폴더에 Enemy1이 공격하는 그림을 찾아 드래그하고 Enemy1Attack으로 정합니다.

역시 Rigidbody 2D 컴포넌트를 추가하고 Kinematic으로 변경, Box Collider 2D를 추가하고 Size를 (1, 1)로 합니다.

Tag는 Enemy, Layer를 BlockingLayer, 렌더러의 Sorting Layer는 Units로 정합니다.

여기서 Enemy1을 Prefabs 폴더로 드래그하여 프리팹화하고, Enemy1을 지우지 말고 변형하여 Enemy2를 바로 만들도록 합시다.

Enemy1을 Enemy2로 이름을 변경합니다. 그리고 Sprites에서 쉬트 12~17을 선택하고 Enemy2로 드래그하여 Enemy2Idle을 생성합니다.


같은 방법으로 쉬트 44, 45를 가지고 Enemy2Attack 애니메이션을 생성합니다.

이제 Enemy1 애니메이터 컨트롤러를 더블클릭하여 편집창을 열어봅시다.


Enemy1을 지우지 않고 변형하여 Enemy2를 만들었기 때문에 Idle과 Attack 상태가 두개씩 만들어져 있습니다. 이 중 Enemy2Idle, Enemy2Attack을 지웁니다.

Enemy1과 Enemy2는 같은 State machine을 사용하여 Idle과 Attack의 두가지 상태만을 표현합니다. Animator Override Controller가 그것을 가능하게 해 줍니다.

프로젝트 창에서 Animator Controller 폴더를 선택한 상태에서 Create>Animator Override Controller를 선택하고 컨트롤러를 생성하고 이름은 Enemy2로 합니다.



그리고 Enemy2 컨트롤러의 인스펙터창을 보면 어떤 컨트롤러를 오버라이드 할 것인지를 묻는 란이 있습니다. 거기에 Enemy1을 드래그합니다.


그러면 아래에 State를 연결해 주는 란이 생기는데 여기에 Enemy2Idle과 Enemy2Attack을 드래그하여 넣습니다.


그리고나서 Hierarchy창의 Enemy2를 선택하고 인스펙터를 보면 Animator 컴포넌트에 Controller가 Enemy1으로 되어 있습니다. 여기에 방금 만든 Enemy2 컨트롤러를 연결합니다.


이렇게 완성된 Enemy2를 Prefabs 폴더로 드래그하여 프리팹화하고 Hierarchy에서 지우고 씬을 저장합니다. 씬 저장용 폴더가 미리 생성되어 있지 않아서 저는 _Scenes라는 폴더를 만들어 Main이라는 이름으로 저장했습니다.

캐릭터 animation 제작이 완료되었습니다. 다음에는 배경 타일, 음료, 음식 등을 만들겠습니다.


Creating the Tile Prefabs


배경으로 만들어야 할 것은  바닥, 음식, 장애물, 탈출구 등입니다.

빈 오브젝트를 하나 만들고 Floor1이라는 이름을 지어주고 Add Component로 Sprite Renderer를 추가합니다.


이 Sprite에 Scavengers_SpriteSheet_32를 연결합니다.


Sorting Layer는 Floor로 지정하고 타일을 프리팹 폴더로 드래그해서 프리팹화합니다.

Floor1의 이름을 Floor2로 바꾸고 Sprite에 Scavengers_SpriteSheet_33을 연결하고 프리팹화, 이런 식으로 Floor8까지 만듭니다.


게속 재사용하여 Exit을 만들겠습니다. 이름을 Exit로 바꾸고 Sprite에 Scavengers_SpriteSheet_20을 연결합니다. Sorting Layer는 Items로 정하고, 이 Exit에 플레이어가 도달하면 성공하는 것으로 판정해야 하므로 Box Collider 2D 컴포넌트를 추가하고 Is Trigger에 체크합니다. Tag는 Exit으로 바꾸고 프리팹 폴더로 드래그 합니다.



다음은 Food 차례입니다. 역시 Hierarchy에서 이름을 Food로 바꾸고 과일모양 스프라이트(Scavengers_SpriteSheet_19)을 연결합니다. Sorting Layer는 Items, Tag는 Food로 바꿉니다. 역시 Box Collider 2D가 필요하므로 그대로 놔둡니다.


다음은 탄산음료입니다. 이름을 Soda로 바꾸고 Scavengers_SpriteSheet_18을 Sprite에 연결합니다. Tag는 Soda로 하고 프리팹으로 드래그합니다.

지금까지 생성한 프리팹은 아래 그림과 같습니다.

이제는 벽을 만들 차례입니다.

이름을 OuterWall1으로 변경하고, Scavengers_SpriteSheet_25를 Sprite에 연결합니다. 지나갈 수 없는 벽이므로 Box Collider 2D의 Is Trigger는 체크 해제합니다. Tag는 Untagged, Layer는 BlockingLayer, Sorting Layer는 Floor로 바꾸고 Prefabs 폴더로 드래그합니다.


다시 이름을 OuterWall2로 변경합니다. 그리고, Scavengers_SpriteSheet_26을 Sprite에 연결하고 나머지는 그대로 둔채 프리팹 폴더로 드래그 합니다. 같은 방식으로 OuterWall3까지 만듭니다.

다음은 내부 벽 차례입니다. 이름을 Wall1으로 변경하고 Scavengers_SpriteSheet_21을 Sprite에 연결합니다. Sorting Layer만 Items로 바꾸고 프리팹 폴더로 드래그 합니다.


이런 식으로 Wall2-스프라이트 22번, Wall3-스프라이트 23, Wall4-24, Wall5-27, Wall6-29, Wall7-30, Wall8-31 까지 만듭니다(스프라이트 넘버 주의).


이것으로 기본 타일 제작을 마쳤습니다.

댓글 없음:

댓글 쓰기