[TIL] Unity - NavMesh 동적 Bake

MINO·2024년 7월 8일
post-thumbnail

2024-07-08


절차적 생성

플레이어가 마을이나 던전에서 포탈을 타면,
다음 던전이 절차적 맵 생성을 통해 형성된다.


절차적 생성 이란 ?

  • 컴퓨터의 무작위성 및 연산 능력과 사람이 만들어낸 자산을 조합해서 알고리즘을 통해 수동이 아닌 자동으로 데이터를 생성하는 방식

활용 예시

마인크래프트의 맵 생성
아이작의 방 구조
오픈월드의 형식의 몬스터 재생성 등..


동적 Bake

기존의 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 해주었다.


결과물


의도하지 않은 Bake 영역

의도한 바는 타일맵 Floor , Walls 를 기준으로 Bake 가 되어야 하는데,
Grid 의 전체 범위가 모두 Bake 되고 있다.

이런 현상 때문에, 오브젝트 풀에서 불러오는 몬스터 프리팹들이 맵 밖에 생성되는 현상이 발견되었다.


Default Area

Navigation Surface 의 프로퍼티 중, Default Area 를 설정하여 해결할 수 있었다.

기존에는 Default Area 가 WalkAble 로 설정되어 있었는데,
이는 지정되지 않은, 즉 타일맵이 없는 부분은 어떤 영역으로 bake 할 지를 결정하는 옵션이었던 것이다.


해결

Not Walkable 로 설정해준 뒤, 동적으로 Bake 를 진행해주니
원하는 영역에만 Bake 되었다.


TIL 마무리

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

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글