This document is about: QUANTUM 2
SWITCH TO

사용자 지정 Navmesh 생성

Quantum navmesh의 생성 또는 베이킹을 사용자 정의하는 이유는 다음과 같습니다.

  • 에이전트가 3D navmesh를 올바르게 걸을 수 있도록 정확도를 높입니다.
  • 런타임 동안 동적으로 Navmesh를 생성하려면(경고: SDK에 여전히 결정적이지 않은 툴체인이 있습니다. 문의해 주십시오).

이 섹션에서는 navmesh 툴을 확장하는 방법을 개괄적으로 설명합니다.

BakeData 생성하기

권장 프로세스는 중간 Navmesh 포맷 MapNavMesh.BakeData를 생성하고 BakeData의 삼각형 정보를 사용하여 Quantum navmesh의 모든 필수 데이터 구조를 채우는 MapNavMeshBaker.BakeNavMesh(MapData data, MapNavMesh.BakeData navmeshBakeData)를 실행합니다.

MapNavMeshBaker.BakeNavMesh()는 편집 시간 동안 사용하도록 개발되었으며 완전히 교체하면 성능이 향상될 수 있지만 훨씬 더 정교한 작업이 될 것입니다.

MapNavMesh.BakeData Class

타입필드설명
StringNamef.Map.NavMeshes[name]이 시뮬레이션 내부에서 접근할 수 있는 navmesh 이름
Vector3Position네브메시의 위치입니다. 최종 네브메시 꼭짓점은 전역 공간에 저장되며 베이킹 중에 이를 통해 위치가 변환됩니다.
FPAgentRadiusNavmesh가 생성되는 최대 에이전트의 반지름. 이전 버전의 Quantum에서는 서로 다른 에이전트 반지름을 허용했지만 이는 폐지되었습니다. 이제 에이전트는 피벗이 탐색망 가장자리에 있을 때까지 걸어 올라갈 수 있습니다. 이렇게 하면 여백 에이전트가 벽에서 멀리 떨어져 있어야 하는 삼각형으로 베이킹됩니다. 이 값은 디버그 그래픽을 렌더링하는 데만 사용됩니다.
List<string>Regions Navmesh에 사용되는 모든 지역 ID. 베이킹 중에 지역 ID가 지도 자산의 지역 목록에 추가되고 해당 인덱스가 Navmesh 삼각형 지역 마스크(NavMeshTriangle.Regions)에 베이킹됩니다. 맵에는 지역 ID를 공유하는 여러 개의 탐색망이 있을 수 있기 때문에 지역이 맵에 집계됩니다.
MapNavMeshVertex[]VerticesNavmesh의 정점.
MapNavMeshTriangle[]TrianglesNavmesh의 삼각형입니다. 이것은 삼각형과 꼭짓점이 두 개의 개별 배열로 유지되고 삼각형 점이 꼭짓점 세 개를 표시하기 위해 꼭짓점 배열로 들어가는 규칙적인 메쉬 데이터 구조입니다.
MapNavMeshLink[]Links동일한 Navmesh상의 위치 간 링크.
enumClosestTriangleCalculationQuantum navmesh는 공간 분할을 위해 그리드를 사용합니다. 각 그리드 셀에는 폴백 삼각형이 할당됩니다. 기본 검색은 매우 느리지만(BruteForce) SpiralOut이 더 효율적이지만 빈 폴백 삼각형이 될 수 있습니다.
intClosestTriangleCalculationDepthSpiralOut 검색 확장을 위한 그리드 셀의 수.
boolEnableQuantum_XYnavmesh 베이킹을 활성화하면 정점 위치의 Y 및 Z 컴포넌트들이 플립되어 XY 평면에서 생성된 navmesh를 지원합니다.
boolLinkErrorCorrection베이킹하는 동안 자동으로 Navmesh 링크 위치를 가장 가까운 삼각형으로 수정합니다.

MapNavMeshTriangle Class

모든 항목이 입력되어야 하는 것은 아닙니다. 이들 중 일부는 레거시 navmesh 그리기 도구에만 필요합니다.

타입필드설명
StringId불필요
String[]VertexIds길이가 3이어야 합니다. 참조된 정점을 ID로 지정합니다. SDK 2.1 이전 버전에 필요합니다.
Int32[]VertexIds2길이가 3이어야 합니다. 참조된 정점을 정점 배열의 인덱스로 사용합니다. SDK 2.2에 필요합니다.
Int32Area불필요
StringRegionId이 삼각형이 속한 영역입니다. 기본값은 null 입니다.
FPCost삼각형의 가격. 기본값은 FP._1이어야 합니다.

MapNavMeshVertex Class

Position의 타입은 FPVector3 SDK 2.2로 대체되었습니다.

타입필드설명
StringIdSDK 2.1 또는 그 이전에서는 필요
Vector3Position정점의 위치
List<Int32>Neighbors불필요
List<Int32>Triangles불필요

SDK 2.2에서는 Start, EndCostOveride의 타입이 각각 FPVector3FP 로 대체되었습니다.

타입필드설명
Vector3Start링크의 시작 위치입니다. 동일한 navmesh에 있어야 합니다.
Vector3End링크의 끝 위치입니다. 동일한 navmesh에 있어야 합니다.
boolBidirectional링크의 양방향 횡단 여부.
floatCostOverride연결 비용
StringRegionId링크가 속한 지역 id. 기본값은 null.
StringName링크의 이름. navmesh.Links[NavMeshPathfinder.CurrentLink()].Name에 의해 검색할 수 있음.

런타임 동안 생성된 Navmesh 데이터를 사용하는 한 가지 방법은 로드된 Quantum NavMesh 에셋의 내용을 교체하는 것입니다.

Quantum.NavMesh 클래스는는 마지막 Quantum navmesh를 나타냅니다. 그러나 툴링('MapDataBaker.BakeNavMeshes에서 볼 수 있음)은 많은 양의 부분(실제로 모든 데이터 어레이)을 포스트픽스 _data.asset이 있는 추가 에셋 파일에 저장합니다. 이 방법은 ScriptObjects에서 대용량 데이터에 대한 제한 사항을 해결합니다.

navmesh 데이터 에셋은 이 속성 Quantum.NavMesh.DataAsset에 의해 나브메시 자산에 연결됩니다. Quantum 에셋 DB가 로드되면 Navmesh 에셋이 데이터 에셋을 역직렬화하고 배열이 다시 작성됩니다.

런타임 동안 Navmesh 에셋을 굽는 경우 직렬화 및 역직렬화를 우회할 필요가 없습니다.

이러한 방식으로 navmesh 데이터를 생성하는 것은 다음과 같은 경우에만 작동합니다.

  • 사용자 정의 navmesh 베이킹은 결정적입니다(예: 고정점 연산만 사용).
  • Quantum navmesh 베이킹은 결정론적입니다(SDK 2.2).
  • 에셋 DB가 이미 로드되었습니다.
  • 시뮬레이션이 실행되고 있지 않습니다.
  • 모든 클라이언트가 이 작업을 실행합니다.

마지막으로 Quantum.Map에서 두 개의 나브메쉬 관련 사전을 업데이트하세요. 이름으로 객체를 검색할 때 사용합니다.

C#

[NonSerialized] public Dictionary<String, NavMesh> NavMeshes;
[NonSerialized] public Dictionary<String, Int32> RegionMap;

동적 에셋 주입

Back to top