대부분 로그라이크 게임에서 랜덤 맵 생성 알고리즘을 이용하여 맵을 런타임 시점에서 동적으로 생성할 것이다. 그렇다면 NavMesh경우 기존에는 완성된 맵을 Bake하여 사용했으나 이번엔 런타임 시점에서 진행해 보려고 한다.
먼저 실습 환경을 구축하고나서 기능을 적용해보려고 한다.
- CineachineVirtualCamera 플레이어 추격
- 플레이어가 맵을 이동할 때마다 상하좌우로 맵 생성
- model의 Read/Write 활성화
이 부분을 활성화해야지 오류가 발생하지 않음


NavMeshSurface는 AI가 이동할 수 있는 표면을 정의한다.
이전 Navigation에서 맵을 bake하는 역할을 수행한다고 보면 된다.
- Agent Type : NavMeshSurface를 사용하는 Agent Type을 정의한다.
- Agent Type마다 NavMesh를 별도로 설정할 수 있다.
- Default Area : NavMesh에 할당할 영역 유형을 설정한다. 즉, AI가 이동하는 지역의 비용을 설정한다.
- Generate Links : 맵을 bake할 때 NavMeshSurface가 수집한 객체끼리 자동으로 링크를 생성한다.
(NavMeshModifier Component를 이용하여 수행한다곤 하는데 이런 식으로 일정 거리 내 수평과 수직 거리를 설정한 뒤 Generatee Links 활성화한다면 조건이 만족함에 따라 동적으로 Link가 형성됨)
4. Use Geometry : bake할 때 적용할 Geometry를 설정
- Render Meshes : Render Meshes와 Terrains의 geometry 사용
- Physics Colliders : Colliders와 Terrains의 geometry 사용(= Render 방식보다 물체 경계에 더 가까이 이동할 수 있다고 함)
- Collect Objects : bake할 때 사용할 GameObject를 정의
- All Game Objects : Hierarchy창에 활성화된 모든 게임 오브젝트를 사용 (= 디폴트 옵션)
- Volume : 특정 반경을 설정하여 해당 범위만 bake
- Current Object Hierarchy : NavMeshSurface 컴포넌트가 부착되어 있는 게임 오브젝트만 활성화(자식 객체도 같이 활성화)
- NavMeshModifier Component Only : NavMesh Modifier컴포넌트가 부착된 게임 오브젝트만 활성화, 해당 GameObjects의 Apply To Children이 활성화라면 자식 객체도 같이 활성화.
- Include Layers : NavMesh를 적용할 레이어를 지정. 지정되지 않은 레이어는 NavMesh를 실행하지 않음
- Advanced : 고급 설정 세션
- 이 부분은 따로 건들일 것 같진 않아서 링크만 남기고 넘어감. (https://docs.unity3d.com/Packages/com.unity.ai.navigation@2.0/manual/NavMeshSurface.html)
NavMeshSurface의 Collect Objects를 Volume으로 설정한 후, 로직을 작성하여 플레이어가 가장자리 부근에 도달하면 NavMesh를 갱신.


NavMeshModifier는 말 그대로 NavMesh가 설정될 때 별도로 값을 조정할 수 있는 기능이다.
다음과 같이 NavMeshModifier 기능을 이용하여 특정 구역의 설정을 변경하였다.

앞에서 Surface의 Collect Object를 Volume으로 설정한 것과 동일하게 특정 범위 내 구역을 바꿔 NavMesh를 적용할 수 있다.


고급 NavMesh의 실습을 마무리하며 생각보다 3D에서도 이제 NavMesh를 활용한 Pathfinding이 간편하게 이루어지는 듯하다. 이번 실습을 통해 앞으로 프로젝트 개발 과정에서 자주 쓰일듯하다.
다만, 이번 실습에서는 맵과 맵을 링크(Link)로 연결하여 동적으로 할당하는 방식까지는 적용하지 못했다. 시간이 된다면 이 부분도 실습을 진행해 보려고 한다.