사용자 지정 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
타입 | 필드 | 설명 |
---|---|---|
String | Name | f.Map.NavMeshes[name] 이 시뮬레이션 내부에서 접근할 수 있는 navmesh 이름 |
Vector3 | Position | 네브메시의 위치입니다. 최종 네브메시 꼭짓점은 전역 공간에 저장되며 베이킹 중에 이를 통해 위치가 변환됩니다. |
FP | AgentRadius | Navmesh가 생성되는 최대 에이전트의 반지름. 이전 버전의 Quantum에서는 서로 다른 에이전트 반지름을 허용했지만 이는 폐지되었습니다. 이제 에이전트는 피벗이 탐색망 가장자리에 있을 때까지 걸어 올라갈 수 있습니다. 이렇게 하면 여백 에이전트가 벽에서 멀리 떨어져 있어야 하는 삼각형으로 베이킹됩니다. 이 값은 디버그 그래픽을 렌더링하는 데만 사용됩니다. |
List<string> | Regions | Navmesh에 사용되는 모든 지역 ID. 베이킹 중에 지역 ID가 지도 자산의 지역 목록에 추가되고 해당 인덱스가 Navmesh 삼각형 지역 마스크(NavMeshTriangle.Regions )에 베이킹됩니다. 맵에는 지역 ID를 공유하는 여러 개의 탐색망이 있을 수 있기 때문에 지역이 맵에 집계됩니다. |
MapNavMeshVertex[] | Vertices | Navmesh의 정점. |
MapNavMeshTriangle[] | Triangles | Navmesh의 삼각형입니다. 이것은 삼각형과 꼭짓점이 두 개의 개별 배열로 유지되고 삼각형 점이 꼭짓점 세 개를 표시하기 위해 꼭짓점 배열로 들어가는 규칙적인 메쉬 데이터 구조입니다. |
MapNavMeshLink[] | Links | 동일한 Navmesh상의 위치 간 링크. |
enum | ClosestTriangleCalculation | Quantum navmesh는 공간 분할을 위해 그리드를 사용합니다. 각 그리드 셀에는 폴백 삼각형이 할당됩니다. 기본 검색은 매우 느리지만(BruteForce ) SpiralOut 이 더 효율적이지만 빈 폴백 삼각형이 될 수 있습니다. |
int | ClosestTriangleCalculationDepth | SpiralOut 검색 확장을 위한 그리드 셀의 수. |
bool | EnableQuantum_XY | navmesh 베이킹을 활성화하면 정점 위치의 Y 및 Z 컴포넌트들이 플립되어 XY 평면에서 생성된 navmesh를 지원합니다. |
bool | LinkErrorCorrection | 베이킹하는 동안 자동으로 Navmesh 링크 위치를 가장 가까운 삼각형으로 수정합니다. |
MapNavMeshTriangle Class
모든 항목이 입력되어야 하는 것은 아닙니다. 이들 중 일부는 레거시 navmesh 그리기 도구에만 필요합니다.
타입 | 필드 | 설명 |
---|---|---|
String | Id | 불필요 |
String[] | VertexIds | 길이가 3이어야 합니다. 참조된 정점을 ID로 지정합니다. SDK 2.1 이전 버전에 필요합니다. |
Int32[] | VertexIds2 | 길이가 3이어야 합니다. 참조된 정점을 정점 배열의 인덱스로 사용합니다. SDK 2.2에 필요합니다. |
Int32 | Area | 불필요 |
String | RegionId | 이 삼각형이 속한 영역입니다. 기본값은 null 입니다. |
FP | Cost | 삼각형의 가격. 기본값은 FP._1 이어야 합니다. |
MapNavMeshVertex Class
Position
의 타입은 FPVector3
SDK 2.2로 대체되었습니다.
타입 | 필드 | 설명 |
---|---|---|
String | Id | SDK 2.1 또는 그 이전에서는 필요 |
Vector3 | Position | 정점의 위치 |
List<Int32> | Neighbors | 불필요 |
List<Int32> | Triangles | 불필요 |
MapNavMeshLink Class
SDK 2.2에서는 Start
, End
및 CostOveride
의 타입이 각각 FPVector3
와 FP
로 대체되었습니다.
타입 | 필드 | 설명 |
---|---|---|
Vector3 | Start | 링크의 시작 위치입니다. 동일한 navmesh에 있어야 합니다. |
Vector3 | End | 링크의 끝 위치입니다. 동일한 navmesh에 있어야 합니다. |
bool | Bidirectional | 링크의 양방향 횡단 여부. |
float | CostOverride | 연결 비용 |
String | RegionId | 링크가 속한 지역 id. 기본값은 null . |
String | Name | 링크의 이름. navmesh.Links[NavMeshPathfinder.CurrentLink()].Name 에 의해 검색할 수 있음. |
런타임에 Navmesh 에셋 교체하기
런타임 동안 생성된 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;