멍멍은댕댕의 개발공간

피하기 게임 만들기 - 4 <아이템, 적> [유니티 2D 기초 강좌] 본문

유니티 강좌/유니티 기초 강좌 (2D)

피하기 게임 만들기 - 4 <아이템, 적> [유니티 2D 기초 강좌]

멍멍은댕댕 2019. 10. 2. 21:52

피하기 게임 만들기 (이전 강좌)

1. 프로젝트 세팅: https://doggie-development.tistory.com/7

2. 캐릭터 움직이기: https://doggie-development.tistory.com/8

3. 벽 충돌: https://doggie-development.tistory.com/9

 

안녕하세요, 취미로 유니티 강좌를 작성하고 있는 "멍멍은댕댕"입니다.

 

저번 시간에는 통과하지 못하는 벽을 만들었습니다. 이번 시간에는 플레이어가 먹을 수 있는 아이템, 닿으면 죽는 적을 만드는 법에 대해 배워보겠습니다.

 

 

준비물

1. 유니티 최신 버전 (저는 2019.2.2로 작업했습니다.)

2. 저번 시간까지 작업한 작업물

 

 

 

강좌를 PDF로 보고 싶다면? 

피하기게임_4.pdf
1.17MB

 

 

 

 

멍댕 유니티 강좌 첫 번째 시리즈!

 

 

 

 

 

 

 

 

 

이번 시간에는 아이템, 그리고 을 만들 것입니다.

우선 아이템부터 생성한 후 크기를 적당하게 조절해주세요.

 

 

 

하이어라키 창에 Item 오브젝트가 나타나 있습니다.

그런데Box이 하이어라키를 어지럽히고 있네요! 깔끔하게 정리할 수 없을까요?

 

 

 

Create를 누른 후 Create Empty를 선택하면 “GameObject”라는 이름의 빈 오브젝트가 생성됩니다.

 

 

 

빈 오브젝트는 말 그대로 텅텅 비어있는 오브젝트!

Transform 이외에는 무엇도 가지고 있지 않기 때문에, Scene이나 Game 창에서 보이지도 않습니다.

 

위치를 (0,  0,  0)으로 만들고, 이름을 Boxes로 바꿔주세요.

 

 

 

모든 Box들을 선택한 후, 드래그 앤 드롭으로 Boxes 오브젝트 안에 넣어주세요.

TIP: 맨 위 Box를 클릭한 후, Shift키를 누른 채로 맨 아래 Box (8)을 누르면 Box들이 모두 선택됩니다.

 

 

 

Boxes 오브젝트 안에 Box들이 들어갔습니다!

이 상태에서 Boxes 왼쪽의 삼각형을 누르면 리스트가 접힙니다.

 

여기서 BoxesBox들의 부모(Parent)“, Box들을 Boxes자식(Child)”이라고 하는데, 대한 자세한 내용은 나중에 다루겠습니다.

 

 

 

빈 오브젝트를 만들어주고, 이번에는 이름을 Items라고 해주세요. 위치도 (0,  0,  0)으로 바꿔주세요.

아이템도 여러 개가 될 것이기 때문에 정리가 필요합니다.

 

 

 

Item 오브젝트를 Items 오브젝트에 넣어주세요.

 

 

 

플레이어가 아이템에 닿았는지확인하려면 역시 아이템에도 충돌체가 있어야 합니다.

Add Component를 눌러주세요.

 

 

 

Physics 2D를 선택하고, Circle Collider 2D를 선택해주세요.

아이템의 생김새가 동그랗기 때문에 Box Collider 2D보다는 Circle Collider 2D가 좋습니다.

 

 

 

위와 같은 컴포넌트가 생기면 됩니다.

 

 

 

Scene에서 보면 Item 오브젝트의 테두리원래는 없던 얇은 초록색 원이 생겼는데, 이게 바로 Item의 충돌 범위입니다.

 

 

 

플레이어가 Item에도 충돌하여 벽과 같이 뚫을 수 없게 되었습니다.

그런데 생각해보면, 아이템은 뚫을 수 없는 물체가 아니라 '통과는 가능한데 닿으면 어떤 효과가 발생하는' 물체 아니었나요?

 

 

 

Item 오브젝트를 선택하고, Circle Collider 2D 컴포넌트의 Is Trigger을 체크해주세요.

 

 

 

게임을 실행해보면 아이템을 통과할 수 있습니다.

그런데 대체 이걸로 무엇을 할 수 있다는 걸까요?

 

 

 

 

바로 지금이 스크립트의 도움이 필요한 순간입니다.

Player 스크립트를 열어주세요.

 

 

 

그리고 새로운 함수를 작성해주세요.

“private void OnTriggerEnter2D(Collider2D collision)”한 글자도 틀리지 않게 잘 적어야 합니다!

 

 

 

사실 하나도 틀리지 말아야 한다는 것은 거짓말이었습니다. private는 빠져도 되고, collision은 다른 원하는 이름으로 해도 됩니다.

 

하지만 저것이 유니티가 제공하는 기본 형태이니, 그대로 하는 것이 좋습니다.

 

 

 

OnTriggerEnter2D 함수Start, Update와 같이 유니티에 내장된 함수입니다.

유니티에서 트리거가 활성화되었을 때실행하는 함수이죠.

 

 

 

트리거가 활성화되었다는 것은 Player 오브젝트가 Is Trigger에 체크가 되어있는 다른 물체에 충돌했다는 것을 말합니다.

 

 

 

OnTriggerEnter2D 함수 안에 위와 같은 코드를 추가해주세요.

Debug.Log 함수를 이용해 원하는 메시지를 출력할 수 있습니다.

 

 

 

PlayerItem에 닿을 때마다 Console 창에 메시지가 출력됩니다.

 

 

 

만약 콘솔 창이 보이지 않는다면 위와 같이 선택하여 콘솔 창을 열 수 있습니다.

콘솔은 에러 메시지 등을 확인할 수 있는 중요한 레이아웃 요소입니다.

 

 

 

어떤 오브젝트에 닿았는지 출력하도록 해봅시다.

collision 인자에는 닿은 물체가 담겨옵니다. Item에 닿았다면 collision에는 Item이 담기는 것이죠.

위 코드에서는 닿은 물체의 이름을 출력하도록 하였습니다.

 

(엄밀하게 말하면 collision.gameObject가 닿은 오브젝트를 지칭하지만, collision에도 주요 정보들이 담겨 있습니다.)

 

 

 

Item에 닿으면 “Item에게 닿았음!”이라고 메시지가 정확하게 출력됩니다.

 

 

 

Item 오브젝트를 복사 + 붙여넣기하여 여러 개로 만든 후, 서로 떨어지도록 위치를 바꿔주세요.

 

 

 

아이템들에 닿을 때마다 닿은 오브젝트의 정확한 이름이 출력됩니다.

 

 

그런데 Item (1), Item, 다 같은 종류의 아이템입니다.

이 오브젝트가 아이템“ 종류의 오브젝트인지 확인하려면 어떻게 해야 할까요? 이름에 "Item"이라는 글자가 들어있는지 일일히 확인해야 할까요? 음... 이는 좋지 않은 방법입니다.

 

Tag라는 개념을 이용해, 이름이 다르더라도, 다 같은 종류로 인식하는 법을 알아보겠습니다.

 

 

 

Item 오브젝트를 선택해주세요.

 

 

Tag라고 표시된 부분을 클릭, Add Tag를 클릭해주세요. 인스펙터 창이 오른쪽과 같이 변할 것입니다.

 

 

 

+를 누른 후 태그 이름을 Item으로 설정, Save를 눌러 저장해주세요.

 

 

위와 같이 Item 태그가 새로 추가됩니다.

 

 

 

다시 Item 오브젝트를 선택한 후, TagItem으로 설정주세요.

 

 

 

태그가 Item으로 잘 설정되었는지 확인해주세요.

새 태그만 생성하고, 정작 오브젝트의 태그는 설정하지 않는 경우가 많습니다 :D

 

 

 

그리고 OnTriggerEnter2D 함수의 내용을 위와 같이 수정해주세요.

CompareTag는 태그를 확인하는 함수입니다. 위의 코드에서는 collision(닿은 물체)의 태그가 “Item”이라면 true를 반환하죠.

 

 

 

테스트를 하기 전에 적 오브젝트도 만들어봅시다.

Enemy 오브젝트생성하고, 크기를 적당하게 조절해주세요.

 

 

 

빈 오브젝트를 생성한 후, 이름을 Enemies바꿔주세요. 위치도 (0,  0,  0)으로 바꿔주세요.

 

앞서 생성한 Enemy 오브젝트를 Enemies 오브젝트 안에 넣어주세요.

 

 

 

Enemy 오브젝트Circle Collider 2D 컴포넌트를 추가해주세요.

Is Trigger에도 체크를 해주어야 합니다.

 

 

 

Add Tag를 눌러 태그 편집창으로 가주세요.

 

 

Enemy 태그를 새로 추가해주세요.

 

 

 

다시 Enemy 오브젝트를 선택한 뒤 태그를 Enemy 설정해주면 됩니다.

 

 

 

그리고 이전에 만들었던 Item (1), Item (2) 등의 오브젝트를 제거해주세요. Item 오브젝트를 복붙하여 새로 만들 것입니다.

혹은 일일히 태그를 Item으로 설정해주어도 됩니다.

 

 

 

그리고 ItemEnemy를 복사, 붙여넣기하여 여러 개의 아이템과 적을 생성해주세요.

 

 

 

그리고 위와 같이 태그가 Enemy 경우의 코드도 추가해주세요.

 

 

 

Item에 닿든, Item (1)에 닿든, 아이템에 닿으면 아이템에 닿음 메시지, Enemy에 닿든 Enemy (1)에 닿든 적에 닿으면 적에 닿음메시지가 출력됩니다.

 

Tag를 적절히 설정했기 때문이죠.

 

 

 

태그를 어떻게 응용할 수 있을까요? 적에 닿으면 플레이어가 사라지도록 해봅시다.

위와 같이 Dead라는 이름의 새로운 함수를 추가해주세요.

 

 

 

Destroy는 괄호 안에 들어가있는 오브젝트를 파괴하는 명령어입니다.

여기서 gameObject나 자신을 말합니다. 이 스크립트에서 Player 오브젝트이므로, 플레이어가 사라집니다.

 

 

 

그리고 기존에 있던 Debug.Log 코드들을 삭제하고, 닿은 상대의 태그가 Enemy인 경우, Dead 함수를 호출하도록 해주세요.

 

 

 

그리고 닿은 상대의 태그가 Item인 경우에는 상대의 gameObject를 파괴하도록 해주세요.

아이템을 먹었으니 아이템을 없애는 것입니다.

 

 

 

아이템을 먹으면 먹은 아이템이 사라지고, 적에 닿으면 플레이어가 사라집니다!

 

 

 

 

이렇게 아이템과 적의 기본 기능을 구현했습니다.

이번 시간에 배운 "트리거"와 "태그" 개념은 아주 중요합니다. 꼭 기억해두시길 바랍니다.

다음 시간에는 적을 움직이는 법에 대해 알려드리겠습니다.