2024-07-08

플레이어가 마을이나 던전에서 포탈을 타면,
다음 던전이 절차적 맵 생성을 통해 형성된다.
절차적 생성 이란 ?
마인크래프트의 맵 생성
아이작의 방 구조
오픈월드의 형식의 몬스터 재생성 등..
기존의 NavMesh 를 활용할 때는, 에티터 상에서 Bake 를 실행한 뒤,
플레이하여 NavMesh Agent 가 Bake 된 경로를 따라 움직일 수 있었다.
그러나 맵이 새로 생성되기 때문에 에디터가 아닌, 플레이 도중 Bake 가 수행되어야 한다.
정확히는 절차적 맵이 성공적으로 완성된 이후, Bake 를 진행해 주어야 한다.
(NavMeshAgent 가 달려있는 Monster 들이 생성되기 전.)
NavMesh Surface 컴포넌트는 특정 타입의 내비메시 에이전트가 걸을 수 있는 영역을 나타낸다.
플레이 도중 NavMesh Surface 에서 Bake 를 진행할 스크립트를 하나 생성해주었다.
public NavMeshSurface[] surfaces;
public void Bake()
{
for(int i=0;i<surfaces.Length; i++)
{
surfaces[i].BuildNavMesh();
}
}
이를 통해 맵이 재생성될 때마다, Bake 함수를 호출하여 동적으로 맵을 Bake 해주었다.

의도한 바는 타일맵 Floor , Walls 를 기준으로 Bake 가 되어야 하는데,
Grid 의 전체 범위가 모두 Bake 되고 있다.
이런 현상 때문에, 오브젝트 풀에서 불러오는 몬스터 프리팹들이 맵 밖에 생성되는 현상이 발견되었다.
Navigation Surface 의 프로퍼티 중, Default Area 를 설정하여 해결할 수 있었다.
기존에는 Default Area 가 WalkAble 로 설정되어 있었는데,
이는 지정되지 않은, 즉 타일맵이 없는 부분은 어떤 영역으로 bake 할 지를 결정하는 옵션이었던 것이다.
Not Walkable 로 설정해준 뒤, 동적으로 Bake 를 진행해주니
원하는 영역에만 Bake 되었다.

NavMesh 를 사용해보며 여러 프로퍼티를 건들여보았지만,
Default Area 의 정확한 뜻을 모르고 사용하여,
오랜 시간을 허비한 것 같아 아쉽다.