월드 지형을 기반으로 자동으로 네비메쉬 그래프를 생성합니다.
Recast 그래프는 Recast(http://code.google.com/p/recastnavigation/)를 기반으로 합니다. 이것을 Unity에서 네이티브로 실행할 수 있도록 상당 부분을 C#으로 번역했습니다.
Recast 그래프를 설정하는 방법에 대한 튜토리얼은 네비메쉬 자동 생성하기( Automatically generating a navmesh)를 참조하세요.
Inspector
Shape
Dimensions
3D 모드 또는 2D 모드를 사용할지 여부.
참조 DimensionMode |
참조 참조 이 설정은 멤버 dimensionMode 에 해당합니다. |
Center
바운딩 박스의 중심.
스캔은 바운딩 박스 내부에서만 수행됩니다.
참조 이 설정은 멤버 forcedBoundsCenter에 해당합니다. |
Size
바운딩 박스의 크기.
참조 이 설정은 멤버 forcedBoundsSize에 해당합니다. |
Rotation
그래프의 회전 각도(도 단위).
참조 이 설정은 멤버 rotation에 해당합니다. |
Snap bounds to scene ()
설정에 따라 스캔 프로세스에 포함될 수 있는 씬의 모든 객체를 정확하게 캡슐화하도록 그래프의 경계를 변경합니다.
어떤 객체가 사용되는지는 설정에 따라 다릅니다. 현재 설정에서 그래프의 경계 내에 있는 객체가 그래프에 영향을 미칠 경우, 해당 객체를 포함하도록 경계가 확장됩니다.
이 메서드는 인스펙터에서 '씬에 경계 맞추기' 버튼에 해당합니다.
참조 rasterizeMeshes rasterizeTerrain rasterizeColliders mask tagMask forcedBoundsCenter forcedBoundsSize |
참조 이 설정은 멤버 SnapForceBoundsToScene에 해당합니다. |
Input Filtering
Filter Objects By
객체의 초기 필터링 방법을 결정합니다.
참조 layerMask tagMask |
참조 이 설정은 멤버 collectionSettings.collectionMode에 해당합니다. |
Layer Mask
이 레이어에 있는 모든 객체가 래스터화됩니다.
collectionMode가 Layers로 설정된 경우에만 사용됩니다.
참조 tagMask |
참조 이 설정은 멤버 collectionSettings.layerMask에 해당합니다. |
Tag Mask
이 태그 중 하나로 태그된 객체가 래스터화됩니다.
collectionMode가 Tags로 설정된 경우에만 사용됩니다.
참조 layerMask |
참조 참조 이 설정은 멤버 collectionSettings.tagMask에 해당합니다. |
Rasterize Terrains
네비메쉬 계산에 지형을 사용합니다.
2D 모드에서는 이 설정이 적용되지 않습니다.
참조 이 설정은 멤버 ollectionSettings.rasterizeTerrain에 해당합니다. |
Rasterize Trees
지형 위의 나무 콜라이더를 래스터화합니다.
나무 프리팹에 콜라이더가 있으면 해당 콜라이더가 래스터화됩니다. 그렇지 않은 경우 간단한 박스 콜라이더가 사용되며, 스크립트는 나무의 크기에 맞추려고 시도합니다. 그러나 정확하지 않을 수 있으므로 콜라이더가 첨부된 것이 더 좋습니다.
참고 Unity는 게임이 시작될 때 런타임에만 나무 콜라이더를 생성하는 것으로 보입니다. 이로 인해 게임 외부에서 그래프를 스캔할 때는 나무 콜라이더를 감지하지 않지만, 게임이 시작된 후 그래프를 스캔하면 나무 콜라이더를 감지합니다. 그래도 감지되지 않으면 나무에 실제로 콜라이더가 첨부되어 있는지 확인하고, 나무 프리팹이 올바른 레이어에 있는지 확인하십시오 (레이어는 레이어 마스크에 포함되어야 합니다). |
2D 모드에서는 이 설정이 적용되지 않습니다.
참조 rasterizeTerrain RecastGraph.colliderRasterizeDetail |
참조 이 설정은 멤버 collectionSettings.rasterizeTrees에 해당합니다. |
Heightmap Downsampling
래스터화를 위해 사용되는 입력 메쉬를 생성하기 전에 지형의 높이맵을 얼마나 다운샘플링할지 제어합니다.
값이 높을수록 스캔 속도는 빠르지만 정확도는 떨어집니다.
참조 이 설정은 멤버 collectionSettings.terrainHeightmapDownsamplingFactor에 해당합니다. |
Rasterize Meshes
씬 메쉬를 사용하여 네비메쉬를 계산합니다.
콜라이더보다 더 높은 정밀도를 얻을 수 있습니다. 콜라이더는 일반적으로 메쉬의 매우 단순화된 버전이기 때문입니다. 그러나 스캔 속도가 느려질 수 있으며, 그래프 업데이트가 특히 느릴 수 있습니다.
그래프 업데이트가 느린 이유는 주어진 타일과 교차하는 모든 메쉬를 효율적으로 찾는 방법이 없기 때문입니다. 따라서 업데이트하려는 타일에 관련된 메쉬를 찾기 위해 씬의 모든 메쉬를 반복해야 합니다. 반면에 콜라이더는 물리 시스템을 사용하여 효율적으로 쿼리할 수 있습니다.
이 설정을 비활성화하고 대신 RecastMeshObj 컴포넌트(dynamic=false)를 네비메쉬에 포함시키고자 하는 모든 메쉬에 첨부할 수 있습니다. 이렇게 하면 씬의 모든 메쉬를 반복하지 않고도 효율적으로 쿼리할 수 있습니다.
2D 모드에서는 이 설정이 적용되지 않습니다.
참조 이 설정은 멤버 collectionSettings.rasterizeMeshes에 해당합니다. |
Rasterize Colliders
네비메쉬를 계산하기 위해 콜라이더를 사용합니다.
dimensionMode 에 따라 3D 또는 2D 콜라이더가 래스터화됩니다.
Sphere/Capsule/Circle 콜라이더는 다각형을 사용하여 근사화되며, 정확도는 RecastGraph.colliderRasterizeDetail에 지정됩니다.
참고 2D 모드에서는 다른 입력 유형(예: 메쉬나 지형)이 지원되지 않으므로 항상 이 설정이 활성화된 것으로 처리됩니다. |
참조 이 설정은 멤버 collectionSettings.rasterizeColliders에 해당합니다. |
Agent Characteristics
Character Radius
네비메쉬를 이동할 에이전트의 반경입니다.
네비메쉬는 이 반경으로 침식됩니다.
참조 이 설정은 멤버 characterRadius에 해당합니다. |
Character Height
캐릭터의 높이.
참조 이 설정은 멤버 walkableHeight에 해당합니다. |
Max Step Height
캐릭터가 오를 수 있는 높이.
참조 이 설정은 멤버 walkableClimb에 해당합니다. |
Max Slope
캐릭터가 이동할 수 있는 최대 경사(도 단위).
참조 이 설정은 멤버 maxSlope에 해당합니다. |
Per Layer Modifications
래스터화된 객체의 레이어를 기반으로 그래프를 수정하는 규칙 목록입니다.
기본적으로 모든 레이어는 이동 가능한 표면으로 처리됩니다. 그러나 이 목록에 규칙을 추가하면 특정 레이어를 가진 모든 표면에 특정 경로 탐색 태그를 부여할 수 있습니다.
각 레이어는 이 목록에서 최대 한 번만 수정되어야 합니다.
객체에 RecastMeshObj컴포넌트가 첨부된 경우, 해당 컴포넌트의 설정이 이 목록의 설정을 재정의합니다.
참조 PerLayerModification |
참조 이 설정은 멤버 perLayerModifications에 해당합니다. |
Rasterization
Voxel Size
복셀 샘플 크기 (x, z).
Recast 그래프를 생성할 때 월드가 복셀화됩니다. 이것은 많은 상자로 구성된 월드의 근사치를 만드는 것으로 생각할 수 있습니다. Minecraft를 플레이해본 적이 있다면 매우 비슷하게 보입니다 (하지만 상자가 더 작습니다).
셀 크기는 이러한 상자의 너비와 깊이를 나타냅니다. 상자의 높이는 일반적으로 더 작으며 자동으로 계산됩니다.
값이 낮을수록 더 높은 품질의 네비메쉬를 얻을 수 있지만, 그래프 스캔 속도는 느려집니다.
참조 이 설정은 멤버 cellSize에 해당합니다. |
Use Tiles
true로 설정하면 그래프를 타일로 나누고, 그렇지 않으면 전체 그래프를 단일 타일로 다룹니다.
타일을 사용하는 것은 여러 가지 유용한 점이 있지만, 몇 가지 단점도 있습니다.
타일을 사용하면 그래프의 일부만 업데이트할 수 있습니다. Recast 그래프에서 그래프 업데이트를 수행할 때 항상 전체 타일을 다시 계산합니다 (또는 타일이 없으면 전체 그래프를 다시 계산합니다). NavmeshCut컴포넌트도 타일 단위로 작동합니다.
타일을 사용하면 NavmeshPrefabs 를 사용할 수 있습니다.
타일을 사용하면 매우 큰 삼각형을 분할할 수 있어, 일부 경우 경로 품질을 개선하고 네비메쉬가 지형의 y좌표를 더 잘 따르도록 만들 수 있습니다.
타일을 사용하면 네비메쉬 생성 속도가 크게 빨라질 수 있습니다. 각 타일을 병렬로 계산할 수 있기 때문입니다. 그러나 타일을 너무 작게 만들면 많은 타일의 오버헤드가 적은 타일보다 느릴 수 있습니다.
작은 타일을 사용하면 경우에 따라 경로 품질이 나빠질 수 있지만, FunnelModifiers의 품질 설정을 높게 설정하거나 RichAI.funnelSimplification을 사용하면 대부분 이를 완화할 수 있습니다.
참조 editorTileSize |
버전 4.1부터 기본값은 true입니다. |
참조 이 설정은 멤버 useTiles에 해당합니다. |
Tile Size
단일 타일의 복셀 크기입니다.
이 값은 타일의 너비를 나타냅니다.
큰 타일 크기는 초기 스캔 속도가 빠를 수 있지만, 큰 세계에서 너무 큰 타일 크기를 시도하면 메모리 부족 문제가 발생할 수 있습니다. 작은 타일 크기는 업데이트 속도가 (훨씬) 빠릅니다.
타일 크기는 경로의 품질에 영향을 미칠 수 있습니다. 더 나은 품질의 경로를 위해 거대한 열린 공간을 여러 타일로 나누는 것이 좋지만, 너무 작은 타일은 보이지 않는 장애물처럼 보이는 효과를 일으킬 수 있습니다. 이에 대한 자세한 내용은 네비메쉬 그래프에 대한 노트를 참조하십시오. 일반적으로 실험을 통해 게임에 가장 적합한 설정을 찾는 것이 좋습니다.
Recast 그래프를 스캔할 때 개별 타일은 병렬로 계산될 수 있어 큰 세계를 스캔하는 속도를 크게 높일 수 있습니다. Recast 그래프의 일부를 다시 계산하려면 타일 단위로만 수행할 수 있습니다. 따라서 타일 크기보다 훨씬 작은 영역을 자주 업데이트하려고 하면 불필요한 계산을 많이 수행하게 됩니다. 반면에 타일 크기보다 훨씬 큰 영역을 업데이트하려고 하면 많은 타일을 사용해야 하는 오버헤드 때문에 필요 이상으로 느려질 수 있습니다 (하지만 그렇게 많이 느려지지는 않습니다).
추천 값은 64에서 256 사이이지만, 이는 매우 유연한 한계입니다. 더 크거나 작은 값도 사용할 수 있습니다.
참조 이 설정은 멤버 editorTileSize에 해당합니다. |
Max Border Edge Length
더 긴 에지는 세분화됩니다.
이 값을 줄이면 경로 품질이 향상될 수 있습니다. 크기가 비슷한 삼각형이 서로 매우 크거나 매우 작은 삼각형보다 더 나은 경로를 제공합니다. 그러나 더 많은 노드를 추가하게 되어 경로 탐색이 느려질 수 있습니다. 이에 대한 자세한 내용은 네비메쉬 그래프에 대한 노트를 참조하십시오.
참조 이 설정은 멤버 maxEdgeLength에 해당합니다. |
Edge Simplification
단순화된 에지에서 실제 에지까지의 최대 거리.
이 값은 복셀 단위로 측정됩니다. 기본값 2는 최종 네비메쉬 윤곽이 월드를 복셀화할 때 계산된 경계에서 최대 2 복셀(즉, cellSize의 2배) 떨어질 수 있음을 의미합니다. 더 높은 값은 더 단순화되고 깔끔한 네비메쉬를 제공하며, 더 낮은 값은 더 많은 세부 사항을 포착할 수 있습니다. 그러나 너무 낮은 값은 개별 복셀이 보이게 할 수 있습니다 (아래 이미지 참조).
참조 cellSize |
참조 참조 이 설정은 멤버 contourMaxError에 해당합니다. |
Min Region Size
최소 영역 크기.
작은 영역은 네비메쉬에서 제거됩니다. 이 값은 복셀 단위로 측정됩니다.
영역이 타일 경계에 인접해 있는 경우, 작은 영역일지라도 인접한 타일이 합쳐져 더 큰 영역을 형성할 수 있으므로 제거되지 않습니다.
참조 이 설정은 멤버 minRegionSize 에 해당합니다. |
Round Collider Detail
구와 캡슐 콜라이더의 래스터화 세부사항을 제어합니다.
콜라이더는 다각형으로 근사화되어 이론적 표면까지의 최대 거리가 1/(이 복셀 수)보다 작아지도록 합니다.
더 높은 값이 반드시 메쉬의 품질을 향상시키는 것은 아니지만, 더 낮은 값은 스캔 속도를 높일 수 있습니다.
메쉬 품질에 영향을 주지 않으면서 이 값을 가능한 낮게 유지하는 것이 가장 빠른 스캔 시간을 제공할 것입니다.
기본값은 1이며, 이는 최대 오차가 1 복셀에 해당합니다. 대부분의 경우, 이를 2보다 높은 값으로 설정하는 것은 (최대 오차 0.5 복셀에 해당) 유용하지 않습니다.
참조 rasterizeColliders |
버전 4.3.80 이전에는 이 변수가 cellSize로 스케일링되지 않아 서로 다른 규모의 씬 간에 쉽게 전환할 수 없었습니다. |
폐기된 설정 collectionSettings.colliderRasterizeDetail 을 사용하십시오. |
참조 이 설정은 멤버 colliderRasterizeDetail에 해당합니다. |
Runtime Settings
Affected By Navmesh Cuts
네비메쉬 컷이 이 그래프에 영향을 미쳐야 하는지 여부.
참조 navmeshUpdateData |
참조 이 설정은 멤버 enableNavmeshCutting에 해당합니다. |
Advanced
Relevant Graph Surface Mode
모든 영역에 RelevantGraphSurface 컴포넌트가 포함되어야 합니다.
씬에 배치된 RelevantGraphSurface 컴포넌트는 해당 네비메쉬 영역이 네비메쉬에 포함되어야 함을 지정합니다.
이 설정이 OnlyForCompletelyInsideTile로 설정된 경우, 네비메쉬 영역에 RelevantGraphSurface가 포함되어 있거나 타일 경계에 인접해 있는 경우 네비메쉬에 포함됩니다. 이로 인해 타일 경계에 인접해 있기 때문에 원하지 않는 작은 영역이 포함될 수 있지만, 모든 타일에 컴포넌트를 배치해야 하는 번거로움을 줄일 수 있습니다.
이 설정이 RequireForAll로 설정된 경우, 네비메쉬 영역은 내부에 RelevantGraphSurface가 있는 경우에만 포함됩니다. 네비메쉬가 타일 간에 연속적으로 보이더라도 타일은 개별적으로 계산되므로 각 영역과 각 타일에 RelevantGraphSurface 컴포넌트가 필요합니다.
위 이미지에서, OnlyForCompletelyInsideTile 모드가 사용되었습니다. 타일 경계는 검은색으로 강조 표시되어 있습니다. 모든 영역이 타일 경계에 인접해 있기 때문에 이 모드는 이 경우 아무것도 제거하지 않으며, DoNotRequire 모드와 동일한 결과를 제공합니다. RelevantGraphSurface 컴포넌트는 파란색 평면의 오른쪽 상단에 있는 녹색 기즈모로 표시되어 있습니다.
위 이미지에서 RequireForAll 모드가 사용되었습니다. 타일은 사용되지 않았습니다. 주황색 큐브 상단의 작은 영역이 사라졌음을 주목하십시오. 이는 해당 영역이 관련 그래프 표면 컴포넌트와 같은 영역에 있지 않았기 때문입니다. 타일이 없기 때문에 결과는 OnlyForCompletelyInsideTile 모드와 동일했을 것입니다 (또는 하나의 타일로 간주할 수도 있습니다).
여기서는 RequireForAll 모드가 사용되었습니다. RelevantGraphSurface 컴포넌트가 하나만 있기 때문에, 해당 컴포넌트가 위치한 타일 내의 영역만 활성화됩니다. 만약 다른 타일에 여러 RelevantGraphSurface 컴포넌트가 있었다면, 해당 영역들도 활성화될 수 있었을 것입니다.
여기서는 다른 타일 크기와 함께 OnlyForCompletelyInsideTile 모드가 사용되었습니다. 주황색 큐브 상단의 영역은 더 이상 존재하지 않습니다. 이는 해당 영역의 경계가 그 영역과 교차하지 않으며, 내부에 RelevantGraphSurface 컴포넌트가 없기 때문입니다.
참고 타일을 사용하지 않을 때, OnlyForCompletelyInsideTile 모드는 RequireForAll과 동일합니다. |
참조 이 설정은 멤버 relevantGraphSurfaceMode 에 해당합니다. |
Initial Penalty
모든 노드에 적용할 기본 페널티입니다.
참조 Graph Updates during Runtime GraphNode.Penalty Working with tags |
참조 이 설정은 멤버 initialPenalty에 해당합니다. |
Recast 그래프가 작동하는 방식
Recast 그래프를 생성할 때 세계가 복셀화됩니다. 이것은 세계를 많은 상자로 구성한 근사치로 생각할 수 있습니다. Minecraft를 플레이해본 적이 있다면 매우 비슷하지만, 더 작은 상자를 사용하는 것입니다.
Recast 프로세스는 다음과 같이 설명됩니다:
- 입력 삼각형 메쉬에서 복셀 틀을 생성합니다. 삼각형을 여러 층의 높이 필드로 래스터화하여 틀을 만듭니다. 그런 다음, 캐릭터가 이동할 수 없는 위치를 제거하기 위해 몇 가지 간단한 필터가 틀에 적용됩니다.
- 틀에 의해 설명된 이동 가능한 영역은 간단한 겹침 2D 영역으로 나누어집니다. 결과 영역은 겹치지 않는 하나의 윤곽선만 가지므로 프로세스의 마지막 단계가 크게 단순화됩니다.
- 내비게이션 폴리곤은 먼저 경계를 추적한 다음 이를 단순화하여 영역에서 벗겨집니다. 최종적으로 생성된 폴리곤은 삼각형으로 변환되어 경로 찾기와 공간 추론에 완벽하게 적합합니다.
Recast 생성 프로세스는 일반적으로 세계에서 보이는 기하학적 구조에서 직접 작동합니다. 이는 일반적으로 좋은 일인데, 세계 기하학 구조가 대개 콜라이더보다 더 자세하기 때문입니다. 그러나 콜라이더를 대신 래스터화하도록 지정할 수 있습니다. 매우 자세한 세계 기하학 구조가 있는 경우, 이렇게 하면 그래프 스캔 및 업데이트 속도가 빨라질 수 있습니다.
수동 편집을 위한 내보내기
에디터에는 생성된 그래프를 .obj 파일로 내보내는 버튼이 있습니다. 보통 생성 프로세스는 게임에 직접 사용하기에 충분하지만, 일부 경우에는 세부 사항을 편집하고 싶을 수 있습니다. 이때 그래프를 .obj 파일로 내보내고, 선호하는 3D 애플리케이션에서 열어 편집한 후 Unity가 가져올 수 있는 메쉬로 내보낼 수 있습니다. 그런 다음 해당 메쉬를 네비메쉬 그래프에서 사용할 수 있습니다.
많은 3D 모델링 프로그램이 다른 축 시스템을 사용하기 때문에 (Unity는 X=오른쪽, Y=위, Z=앞을 사용) 회전과 스케일링을 올바르게 설정하는 것이 까다로울 수 있습니다. 예를 들어, 블렌더에서는 먼저 .obj 임포터를 사용하여 메쉬를 가져옵니다. 설정에서 축과 관련된 사항은 변경하지 마십시오. 그런 다음 메쉬를 선택하고 변환 탭을 열어(보통 3D 뷰 오른쪽의 얇은 도구 모음) Scale -> Z를 -1로 설정합니다. S(스케일) 단축키를 사용하여 변환하면 어떤 이유에서인지 Z와 Y가 모두 -1로 설정됩니다. 필요한 편집을 한 다음 .obj 파일로 내보내어 Unity 프로젝트의 어딘가에 저장합니다. 하지만 이번에는 "Forward"라는 설정을 "Z forward"로 변경합니다(기본값은 -Z로 설정되어 있음).
A* Pro 기능 이 기능은 A* Pathfinding Project Pro 버전에서만 사용할 수 있습니다. 이 함수/클래스/변수는 A* Pathfinding Project의 무료 버전에는 존재하지 않거나 기능이 제한될 수 있습니다. Pro 버전은 여기에서 구매할 수 있습니다. |
'유니티 에셋 > A* Pathfinding project pro' 카테고리의 다른 글
Class RichAI Extends AIBase, IAstarAI (1) | 2024.07.01 |
---|---|
Class LayerGridGraph Extends GridGraph, IUpdatableGraph (0) | 2024.06.28 |
Class DynamicGridObstacle Extends GraphModifier (0) | 2024.06.26 |
Class GridGraph Extends NavGraph, IUpdatableGraph, ITransformedGraph, IRaycastableGraph (0) | 2024.06.23 |
Classes (0) | 2024.05.29 |