[Unity]12.네비게이션을 이용한 미로게임 만들기

안녕하세요 유랑입니다.



이번 시간에는 유니티에서 제공해주는 네비게이션 시스템에 대해 알아보겠습니다.

길 찾기나 추적 알고리즘인 네비게이션은 게임에 필수적인 요소로 자리잡고 있습니다.




1. 네비게이



길찾기 알고리즘으로 잘 알려진 A* 알고리즘, 다익스트라 같은 알고리즘을 직접 코딩하지 않고, 

유니티 엔진에서 구현이 가능하다는 점이 참 매력적입니다.

몬스터가 미로에서 도착점까지 가는 로직을 구현해 보겠습니다.







1-1) 프로젝트 생성 후 설정



프로젝트 이름과 위치를 설정 후 만들어 줍니다.






에셋 스토어에서 미로로 쓸 오브젝트와 몬스터로 쓸 오브젝트를 다운받아 임포트 합니다.

Maze Generator와 BOSS Class - Bull은 무료이니 걱정하지 마세요.







Maze 에셋에 있는 demo씬을 열고 실행합니다.

그러면 스크립트에 의해서 미로가 자동 생성됩니다.

생성 된 MazeSpawner를 프리팹 폴더로 옮겨 놓습니다.





새로울 씬을 만들고, 프리팹으로 만들어둔 MazeSpawner를 하이라키 뷰에 드래그 앤 드랍하여 옮겨 놓습니다.

그리고 Maze Spwaner 스크립트 컴포넌트를 삭제합니다. 

프리팹이니 Apply를 눌러 모델에도 적용해 줍니다.





미로하면 미노타우르스져.

이것도 드래그 앤 드랍하여 하이라키 뷰에 가져다 놓습니다.

문제는 쉐이더 적용이 안되어서 이미지가 제대로 보이지 않네요.

Bull => Object001 컴포넌트 안에 쉐이더가 있는데 Mobile/Diffuse로 변경해 줍니다.

모바일용으로 쓰이는 기본적인 쉐이더입니다.





짜잔 이제 모습이 제대로 보이게 됐습니다.






1-2) NavMeshAgent 컴포넌트



우선 몬스터가 충돌처리를 할 수 있도록 Rigidbody, Capsule Collider 컴포넌트를 추가해 주세요.

충돌할 크기를 생각해 적당한 크기로 설정해 줍니다.






NavMeshAgent 컴포넌트는 네비메쉬 데이터를 기반으로 목적지까지 최단거리를 계산해 이동하는 역할을 하며

장애물을 회피하는 기능까지 제공합니다.

이 때 쓰는 알고리즘은 A* PathFinding 알고리즘입니다.

다음 컴포넌트를 추가해 주세요.

속성들의 의미는 나중에 따로 설명해 드리겠습니다.





네비메쉬 에이전트는 네비메쉬의 데이터가 필요하다고 소개하였다.

그러려면 바닥이 되어줄 Floor들을 모두 선택하자.

하이라키 검색창에 Floor라고 입력하면 바로 찾을 수 있다.





상단 메뉴창 Window => AI => Navigation을 선택하면 네비게이션 뷰가 나타납니다.

Object => Navigation Static을 선택해 주세요.

그러면 Navigation Static으로 된 오브젝트들을 검색해 줍니다.





Bake를 누르게 되면 해당 Floor들에 몬스터가 이동할 수 있는 구역이 설정됩니다.





미로 오브젝트들을 담고 있는 MazeSpawner의 Static을 Navigation Static으로 바꿔줍니다.

그러면 자식들까지 바꿀 것인지 알림창이 뜨게 되는데 자식들 모두 바꿔 주세요.

하지만 Coin들은 몬스터가 가는 길에 장애물이 아니겠죠?

Static => Noting으로 설정해 줍니다.







이제 장애물까지 포함해서 이동경로가 완성되었습니다.






1-3) Human 캐릭터 Tag 설정



미로 안에 사람을 만들어 주겠습니다.

Capsule을 만들어 주고 Tag는 TARGET, Trigger를 체크해 주세요.

미노타우르스와 Human 캐릭터가 충돌처리가 일어났을 때 TARGET이면 이벤트를 처리해 주도록 처리하겠습니다.






미노타우르스 캐릭터 크기가 생각보다 작기때문에 Scale값을 증가시켜주었습니다.






1-4) 미노타우르스 애니메이션 설정



미노타우르스가 뛰어가는 모션과 가만히 서있는 모션을 넣어 주겠습니다.

마우스 우측버튼을 이용해 프로젝트 뷰에 BullAnim이라는 애니메이터를 생성해 주고 

해당 애니메이터를 더블 클릭하여 애니메이터 뷰를 보여주겠습니다.

그리고 idle과 run 애니메이션 프리팹을 드래그앤 드랍하여 옮겨 주세요.






Animator => Parameters에 파라미터 값들을 추가해 주겠습니다.

십자가 표시를 누르고 Trigger 속성인 Run과 Bool 속성인 isFinish를 생성해주세요.





우선 idle위에서 마우스 우측 버튼을 이용해 Set as Layer Default State로 만들어 주세요.

그러면 게임을 실행할 경우 처음에 실행되는 기본적인 애니메이션으로 설정됩니다.

그리고 AnyState위에서 마우스 우측 버튼을 이용해(Make Transition) Run과 이어줍니다.

Conditions => Run을 추가하고 Has Exit Time 체크는 해제해 주세요. 

만약 체크가 되어있다면 애니메이션을 끝까지 실행 후 다음 애니메이션으로 변경됩니다.





run +> idle로도 Transition을 이용해 이어줍니다.

이번에는 isFinish를 추가하고 true로 설정해 주세요.






1-5) 스크립트 설정



Bull => Animator 컨트롤러를 아까 전에 생성해둔 BullAnim으로 바꿔줍니다.

그리고 PlayerCtrl 스크립트를 생성 후 코드를 다음과 같이 작성해 주세요.

작성 후 Target Tr은 Human 오브젝트를 넣어주세요.






Hash테이블에 애니메이터 파라미터 값들을 넣어주자.

Start는 void가 아닌 IEnumerator로 시작되는데

게임 실행 후 3초 뒤에 네비게이션이 시작되는 로직이다.

미노타우루스가 Human오브젝트를 만날 경우 3초 뒤에 해당 씬이 재실행된다.







run Animation 설정이 한 번만 실행되도록 되어있다.

해당 프리팹에 들어가 Loop Time을 체크하여 계속 실행되도록 하자.





MainCamera를 미노타우르스 프리팹에 넣어주어도 되지만 Smooth Follow스크립트를 이용해 

일정거리를 유지하며 따라 다니도록 설정해 주었다.

해당 스크립트는 유니티 기본 에셋에서 제공되며,

하단에 깃허브 홈페이지로 들어와 다운받아도 괜찮습니다.








2. 마무리



이번 시간에는 유니티에서 제공해 주는 네비게이션 시스템을 이용해 미로게임을 만들어 보았습니다.

다음 시간에는 라이트매핑에 대해 배워보겠습니다.

오늘도 고생하셨습니다.

감사합니다.



수업자료: https://github.com/YouRang12/-Tistory-Unity---Basic




댓글

Designed by JB FACTORY