본문으로 바로가기

Unity3D) Navigation - 2

category Unity3D/기능 2021. 1. 31. 15:02

NavMesh Agent Component 에서 Agent Type을 Custom Type으로 변경한다면 Error가 발생하게 된다.

'SetDestination' Can only be called on an active agent that has been placed on a NavMesh

라는 오류가 발생하게 되는데,' Baking 한 Area들이 Type에 따라서 이동할 수 있는지 없는지 '

를 판단할 수 있는 로직이 없기 때문에 NavMesh 위에 배치되어야 한다는 오류가 발생한다.

 

그래서 위를 해결하기 위해 NavMeshSurface Component를 사용해야 하는데, 이는 Unity2020.2.2f 버전에는 없다.

그러므로 Unity-Technologies Git에서 NAvMeshSurface를 다운받아 사용해야 한다.

 

github.com/Unity-Technologies/NavMeshComponents/releases/tag/2019.4.0f1

이곳에서 Source code를 다운로드 할 수 있고, 이중에서 Assets/NavMeshComponent 폴더 안에 있는 내용만 사용한다.

 

NavMeshComponent 폴더를 압축푼 후, 우리 프로젝트의 Assets 폴더 안에 집어넣는다.

 

자신의 프로젝트/Assets 폴더 안에 압축해제

다시 프로젝트로 돌아와서, 자신의 NavMesh Object들에 대해서 NavMeshSurface Script를 추가해준 뒤,

Agent Type을 설정해준다.

본인같은 경우 Plane이 해당한다.

 

Plane의 NavMeshSurface Component와 Area들의 모습

Bake를 누르게 되면 Area들이 설정되게 되는데, 겹쳐보이게 된다.

이제 Custom Agent Type을 사용할 수 있다.

실제로 NavMeshSurface 같은 Script를 직접 작성할 순 있지만, 길고 너무 복잡하다. (실제로 확인해보자)

 

이번엔 똑같은 Plane을 하나 더 배치하고, NavMeshLink Component를 사용한다.

 

다음과같이 Plane을 복제하여 배치한 후, Empty Object를 만들어 Plane의 사이에 두고

NavMeshLink를 AddComponent 해주면 자동으로 Plane의 사이에 만들어지게 된다.

클릭을 하여 Capsule을 이동시키면, OffMesh로 이어진 구간으로만 이동하게 되는데, Width의 크기를 늘려 이동 공간을 늘릴 수 있다.

 

다음은 장애물을 만들어보겠다.

 

NavMeshObstacle Component를 이용하여 장애물을 생성할 수 있다.

특이점은 Carve옵션인데 활성화하면, Bake없이 자동으로 Obstacle의 Area를 생성한다. ( 이동 불가 지역으로 )

Shape의 모양은 Box와 Capsule 두 개만 지원한다.

 

Navigation 예제는

github.com/kimduuukbae/Today-I-Learned/tree/master/Unity3D/Navigation 에서 받아볼 수 있다.

 

'Unity3D > 기능' 카테고리의 다른 글

Unity3D) Firebase 연동  (0) 2021.02.18
Unity3D) Input System  (0) 2021.02.17
Unity3D) Navigation - 1  (0) 2021.01.31