Priv's Blog

FPS Microgame) FPS Mod: Creating the Navigation Mesh 본문

Unity Learn/FPS Micro Game

FPS Microgame) FPS Mod: Creating the Navigation Mesh

Priv 2020. 2. 13. 17:25

출처

 

FPS Mod: Creating the Navigation Mesh - Unity Learn

Help your AI enemies find their way around your FPS level by 'baking' the Navigation Mesh (or 'NavMesh').

learn.unity.com


1. NavMesh란?

'Navigation Mesh' 또는 'NavMesh'는 Nav Mesh Agent 컴포넌트를 가지고 있는 AI 유닛들이 레벨을 움직일 수 있도록 만들어주는 3D 메쉬(Mesh)입니다.

 

아래의 이미지에서 청색 구역이 NavMesh이며, 메쉬로 덮이지 않은 구역들은 Nav Mesh Agent 컴포넌트를 가진 유닛들이 접근할 수 없는 구역입니다.

청색으로 덮이지 않은 구역들을 봐주세요.

만약 플레이어가 이 구역 안에 있다면, AI 유닛이나 'Agents'는 플레이어에게 접근할 수 없습니다.

 

 


2. NavMesh를 '굽는' 방법

1) Navigation 창을 에디터에 표시하는 것부터 시작해보겠습니다.

상단 메뉴에서, 다음 경로로 이동해주세요: Window > AI > Navigation

 

 

2) Navigation 탭/창이 나타나고, Scene 뷰에는 기존 NavMesh가 청색으로 표시될 것입니다.

 

 

3) Navigation 탭에서, Bake 탭을 클릭하셔서 NavMesh bake 설정을 띄워주세요.

 

 

4) 설정에서 조정할 것이 있는지 살펴보시고 결정해주세요.

 

굽기 설정 - 기본 설정 용어 정리

Baked Agent Size: NavMesh를 '구울 때' 생성되는 청색 구역

 

Agent Radius: NavMesh Agent의 '테두리'.

또는 Agent가 레벨 내의 좁은 공간을 통과하는데 필요한 너비.
(Or how much horizontal space your Agent requires to be able to traverse narrow areas in the level.)

Agent (또는 AI 유닛)이 통과할 수 있을 정도의 충분한 너비가 없다면, NavMesh가 레벨의 공간 내에 생성되지 않을 것입니다. (아래의 예시를 참고해주세요.)

 

Agent Height: Agent (또는 AI 유닛)의 '높이'.

또는 Agent가 레벨 내의 낮은 공간을 통과하는데 필요한 높이.
(how much vertical space your Agent requires to be able to traverse low height clearance areas in the level.)

Agent (또는 AI 유닛)이 통과할 수 있을 정도의 충분한 높이가 없다면, NavMesh가 레벨의 공간 내에 생성되지 않을 것입니다. (아래의 예시를 참고해주세요.)

 

Max Slope: AI가 얼마나 가파른 경사를 오를 수 있는지를 결정.

현재, 경사가 "45"로 설정되어 있습니다.

이는 NavMesh가 45도 이하의 경사에만 NavMesh가 적용됨을 의미합니다.

 

Step Height: AI가 통과할 수 있는 높이를 결정.

현재, step의 값이 "1"로 설정되어 있습니다.

이는 NavMesh가 1 미터보다 낮은 높이의 구역에만 적용됨을 의미합니다.

 

Generated Off mesh Links: NavMesh를 '구울 때' NavMesh 섹션들 사이에 생성되는 링크들.

 

Drop Height: AI의 수직 점프.

만약 AI가 NavMesh가 끊어진 구역을 위/아래로 점프할 수 있도록 만들고 싶으시다면, 두 구역에 사이에 '링크'를 생성하여 구현하실 수 있습니다.

Drop Height 값에 Agent가 뛸 수 있는 최대 높이를 설정하시고, Bake 버튼을 눌러주시면 됩니다.

설정 값 이하의 수직 높이로 분리된 NavMesh 구역 사이에 '링크'가 나타난 것이 보이실 겁니다.
(아래의 예시를 참고해주세요.)

 

Jump Distance: AI의 수평 점프.

만약 AI가 끊어진 NavMesh 구역을 뛰어 넘어가도록 만들고 싶으시다면, 두 구역 사이에 '링크'를 생성하여 구현하실 수 있습니다.

Jump Distance 값에 AI가 뛸 수 있는 최대 거리를 설정하시고, Bake 버튼을 눌러주시면 됩니다.

설정 값 이하의 가로 거리로 분리된 NavMesh 구역 사이에 '링크'가 나타난 것이 보이실 겁니다.
(아래의 예시를 참고해주세요.)

Agent Radius 값이 "0.5" 미터, Agent Height 값이 "2"미터로 설정되어 있습니다.

비탈길 아래의 좁은 구역(적색 삼각형으로 표시된 구역)이 NavMesh가 구워지기에 너무 낮거나 좁은지 확인해주세요.

또한 NavMesh에서 분리된 적색 삼각형 너머에 NavMesh 조각이 보이실 겁니다.

이것은 AI 유닛이 움직이기에 수직, 수평 공간이 충분한 곳임을 의미하며, 여기에는 이동할 수 있는 길이 없는 구역도 포함됩니다.

Drop Height 값을 "2"미터로 설정하고 구우시면, 2미터 이하의 NavMesh 공간 사이에 'NavLinks'가 생성될 것입니다.

Jump Distance 값을 "4"미터로 설정하고 구우시면, 4미터 이하의 Navmesh 공간 사이에 'NavLinks'가 생성될 것입니다.

 

 

5) 설정이 마음에 드신다면, 하단에 있는 Bake 버튼을 눌러주세요.

이제 NavMesh로 덮이지 않았던 구역이 덮이게 된 것을 확인하실 수 있습니다.

 

 

NavMesh '굽기'를 워크 플로우 내에 통합시키는 방법

레벨 제작 작업을 진행하면서, 레벨을 완성하기까지 수많은 레벨 에셋들을 추가, 제거, 이동시켜야 합니다.

이 과정을 반복하는 동안, Play 모드에 들어가기 전에 NavMesh를 '구워야' 합니다. 그렇지 않으면 AI가 레벨의 수정된 구역이나 새로 제작된 구역에 접근하지 못할 수 있습니다.

 

축하드립니다, 이제 navigation mesh를 어떻게 '굽는지', 언제 사용하는지에 대해 배우셨습니다.

 

 


3. 추가 기능 - Navigation 창의 다른 탭 탐색해보기

Agents 탭

Agents 탭은 어떻게 Agent(Nav Mesh Agent 컴포넌트를 가지고 있는 유닛들)가 구워진 NavMesh에 따라 움직일 것인지에 대한 모든 정보가 표시되는 탭입니다.

예를 들어, 이러한 변수들은 Agent가 지나갈 수 없는 특정 섹션을 만들기 전에 높이를 어느 정도로 해야 하는지 결정하는데 도움이 됩니다.

 

 

Areas 탭

Areas 탭에서는 레벨에서 Agent가 갈 수 있거나 없는 섹션이 무엇인지 좀 더 디테일하게 설명할 수 있는 'area'라는 새로운 타입을 제작하실 수 있습니다.

각각의 Area에 할당된 Cost는 여러 개의 Area 중에 Agent가 하나를 선택해야 하는 경우, 특정 경로를 결정하는데 도움이 됩니다.

Cost가 높을수록, Agent가 더 낮은 Cost의 Area들 사이에서 해당 Area를 선택할 가능성이 줄어듭니다.
(The higher the Cost, the less likely the agent is to traverse that area if offered a choice between a lower Cost area.)

이제 "Lava"라는 이름의 새로운 area를 생성해보겠습니다.

User 3 옆의 빈 박스를 클릭하시고 Lava라고 입력해주세요.

Lava area의 Cost23으로 늘려주세요.

Nav Mesh Agent 컴포넌트 내에서 Area Mask를 조정하실 때마다 Area가 추가되어 드롭다운 메뉴에서 모든 새로운 Area를 보실 수 있습니다.
(Now with the added Area whenever you adjust the Area Mask within the Nav Mesh Agent component, you’ll see that the dropdown includes all new areas.)

Nav Mesh Agent 컴포넌트를 수정하시려면, 수정할 AI 유닛의 프리팹을 찾아주세요.

튜토리얼에서 사용할 Enemy_HoverBot 의 경로는 Assets > UTech > FPS  > Prefabs > Enemies > Enemy_HoverBot.prefab 입니다.

Enemy_HoverBot 프리팹을 더블 클릭으로 열어주시면, Inspector 창에 프리팹의 컴포넌트들이 보이실 겁니다.

스크롤을 내리셔서 Nav Mesh Agent 컴포넌트를 찾아주세요.

이제 프리팹에 있는 Nav Mesh Agent 컴포넌트가 보이실 겁니다.

Area Mask를 찾아 드롭 다운 메뉴를 클릭해주세요.

드롭 다운 메뉴에서 유닛이 무시했으면 하는 Area는 체크 해제해주세요.

 

 

Bake 탭 - 고급 설정

Advanced: NavMesh의 고급 설정

Manual Voxel Size: Voxel 사이즈 수동 설정을 위한 토글

Voxel Size: Navmesh 굽기 프로세스가 레벨 형상에 맞게 얼마나 정교하게 작동할지를 결정

Min Region Area: Navmesh를 굽는데 필요한 최소 영역을 결정

Height Mesh: 계단 등의 제한된 기하학 위의 NavAgent를 위해 Navmesh를 정확하게 배치하는 것을 도와줍니다.
(Helps determine accurate placement of the Navmesh for your NavAgents on constrained geometry, like stairs for example.)

 

 

Objects 탭

특정 오브젝트가 "Area"인 것을 결정하려면, "Object" 탭으로 이동하셔야 합니다.

Area 타입을 조정하려는 오브젝트의 메쉬를 선택하세요.

변경하고자 하는 "Navigation Area" 이 있는 메쉬를 선택하시면 NavMesh를 구우실 수 있으며, NevMesh 렌더가 선택된 모든 영역에 동일한 색상으로 표시될 것입니다.

예시에서는 Basic_Floor 오브젝트 구역을 "Lava"로 바꿔보겠습니다.

(1). Scene 뷰 또는 Hierarchy 창에서 오브젝트를 선택해주세요.

오브젝트가 선택되면, "Scene Filter"가 기본적으로 "Mesh Renderers"를 선택합니다.

만약 레벨에서 지형(Terrain)을 사용하는 경우, 기본값이 "Terrains"로 변경됩니다.

(2). 오브젝트를 선택하시면, "Navigation Area" 드롭다운 메뉴를 사용하실 수 있습니다.

(3). 드롭다운을 선택해주세요.

(4). "Lava"를 선택해주세요.

(5). "Bake" 탭을 찾아주세요.

(6). "Bake" 버튼을 눌러주세요.

 

이제 4개의 Basic_Floor 오브젝트들이 "Lava" Area를 사용하므로, Bake 탭에서 "Bake"를 클릭하시면, 해당 영역의 색상이 바뀌고 NavMesh Agent 컴포넌트에서 해당 구역을 무시 또는 통과시킬 것인지를 결정하실 수 있습니다.

이제 HoverBot을 선택하시고 NavMesh Agent 컴포넌트를 살펴보시면 Area Mask 드롭다운에서 Agent가 어떤 구역을 무시하도록 만들 것인지 결정하실 수 있습니다.

Hierarchy 창에서 찾은 Enemy_HoverBot을 선택해주세요.

 

 


4. 가입 및 공유하기

유니티 커넥트에 가입하셔서 작업하신 결과물과 경험들을 다른 유저들과 함께 공유해보세요.

유니티 커넥트(Unity Connect)에 있는 FPS Creators Group에 아직 가입하지 않으셨다면, 한 번 가입해보시는 걸 추천드립니다.

FPS Microgame 프로젝트와 관련된 튜토리얼들을 진행하시면서 막힌 부분에 대한 질문을 올리시거나, 다른 유니티 크리에이터 분들과 함께 직접 제작하신 결과물들을 공유하실 수도 있습니다.

이 뿐만 아니라 여러 유니티 전문가 분들이 각종 도움이나 아이디어를 제공해 드리고자 활동하고 계십니다.

한 번 확인해보세요!

 

 


 

 

수고하셨습니다!


Comments