정확한 캐릭터 배치를 위한 높이 메시 빌드(Building Height Mesh for Accurate Character Placement)
추가 로딩을 사용하여 여러 내비메시 로드(Loading Multiple NavMeshes using Additive Loading)

내비게이션 영역 및 비용(Navigation Areas and Costs)

Navigation Areas 는 특정 영역을 걸어서 지나가는 데 드는 비용(어려움)을 뜻하며, 경로를 탐색할 때에는 낮은 비용 영역순으로 선택됩니다. 또한 각각의 내비메시 에이전트에는 Area Mask 가 있어 에이전트가 이동할 수 있는 영역을 지정할 수 있습니다.

위의 예제에서, 영역 타입은 아래 두 개의 사용 사례에 사용됩니다.

  • Water영역에는 높은 비용을 할당되어 있어 걸어가는 데 더 많은 비용이 소요됩니다. 이를 통해 물이 얕은 곳을 느리게 걸어가는 시나리오를 처리할 수 있습니다.
  • Door 영역에는 특정 캐릭터만 접근할 수 있습니다. 이를 통해 사람은 통과할 수 있지만 좀비는 통과할 수 없는 시나리오를 처리할 수 있습니다.

영역 타입은 내비메시 베이킹에 포함된 모든 오브젝트에 할당할 수 있으며, 각각의 오프 메시 링크에는 영역 타입을 지정하는 프로퍼티가 있습니다.

경로 탐색 비용

비용을 조절하여 경로 탐색자가 경로를 탐색할 때 선호하는 영역을 제어할 수 있습니다. 예를 들어 한 영역의 비용을 3.0으로 설정하면, 해당 영역을 지나가기 위해서는 다른 경로로 지나갈 때보다 세 배의 시간이 걸립니다.

비용의 작동 방식을 완전히 파악하기 위해 경로 탐색자의 작동 방식을 살펴보겠습니다.

경로 탐색 도중 거쳐가는 노드와 링크
경로 탐색 도중 거쳐가는 노드와 링크

Unity는 A\를 사용하여 내비메시에서 최단 경로를 계산합니다. A\는 연결된 노드 그래프에서 작동합니다. 이 알고리즘은 경로 시작점에서 가장 가까운 노드에서부터 시작하여 여러 연결 노드를 거쳐 목적지에 도달합니다.

Unity 내비게이션은 폴리곤 메시로 나타나기 때문에 경로 탐색자는 우선 각 폴리곤에 노드의 위치가 되는 포인트를 배치해야 합니다. 최단 경로는 이 노드들 사이에서 계산됩니다.

위 그림의 노란 점과 선은 A\*를 따라 가로지르는 순서에 따라 노드와 링크가 내비메시에 배치되는 방식을 보여줍니다.

두 노드 사이를 이동하는 비용은 이동하는 거리와 링크 아래의 폴리곤 영역 타입에 설정된 비용에 따라 달라지며, 이를 거리 * 비용 이라고 합니다. 실제로 영역의 비용이 2.0인 경우 해당 폴리곤을 지나가는 거리는 두 배로 표시됩니다. A\* 알고리즘에서는 모든 비용이 1.0 이상이어야 합니다.

최종 경로에서의 비용의 영향은 조절하기 어려우며, 특히 경로가 길수록 더 어렵습니다. 비용을 다루는 가장 좋은 방법은 비용을 힌트로 취급하면 됩니다. 예를 들어, 에이전트가 오프 메시 링크를 너무 자주 사용하지 않게 하려면 이 비용을 늘리면 됩니다. 하지만 에이전트가 보도 위를 걷는 것을 선호하는 동작을 조절하기는 어려울 수 있습니다.

어떤 레벨에서 경로 탐색자는 항상 최단 경로를 선택하지 않는다는 점도 알아두어야 합니다. 이는 노드 배치 때문입니다. 작은 장애물 옆에 큰 열린 영역이 있을 때, 즉 내비게이션 메시에 아주 큰 폴리곤과 아주 작은 폴리곤이 포함될 때 이런 현상을 쉽게 볼 수 있습니다. 큰 폴리곤의 노드는 해당 폴리곤의 아무 곳에나 배치될 수 있는데, 경로 탐색자의 관점에서 볼 때 이것이 우회 경로로 보일 수 있습니다.

영역 타입비용Areas 탭에서 전역으로 설정하거나 스크립트를 사용하여 에이전트별로 오버라이드할 수 있습니다.

영역(Area) 타입

영역 타입은 내비게이션 창영역 탭에 있습니다. 29 개의 커스텀 타입과 _ 걸을 수 있는, _ 걸을 수 없는, _ 점프_ 등 3개의 빌트인 타입이 있습니다.

  • Walkable은 걸을 수 있는 영역을 의미하는 일반적인 영역 타입입니다.
  • Not Walkable은 내비게이션을 방지하는 일반적인 영역 타입입니다. 내비메시가 해당 영역을 지나가지 못하게 하면서 특정 오브젝트를 장애물로 표시할 때 사용할 수 있습니다.
  • Jump는 자동으로 생성된 모든 오프 메시 링크에 할당되는 영역 타입입니다.

다른 영역 타입의 오브젝트가 여러 개 중첩되는 경우 일반적으로 최종 생성된 내비메시 영역 타입이 우선적으로 적용됩니다. 하지만 Not Walkable 은 예외적으로 항상 최우선적으로 적용됩니다. 이를 통해 특정 영역을 차단해야 하는 경우 확실하게 차단할 수 있습니다.

영역(Area) 마스크

각 에이전트에는 내비게이션에 사용할 영역을 정의할 수 있는 Area Mask 가 있습니다. 영역 마스크는 에이전트 프로퍼티에서 설정할 수 있으며, 런타임 중에는 스크립트를 사용하여 비트마스크를 조작할 수 있습니다.

영역 마스크는 특정 타입의 캐릭터만 해당 영역을 지나갈 수 있게 할 때 유용합니다. 예를 들어 좀비에게서 도망치기 게임에서 각각의 문 아래 영역을 Door 영역 타입으로 표시하고, 좀비 캐릭터의 영역 마스크에서 Door 영역을 선택 해제하면 좀비가 해당 영역을 통과하지 못합니다.

추가 정보

정확한 캐릭터 배치를 위한 높이 메시 빌드(Building Height Mesh for Accurate Character Placement)
추가 로딩을 사용하여 여러 내비메시 로드(Loading Multiple NavMeshes using Additive Loading)