Navmesh 지역 사용하기
Quantum navmesh 영역에서 결정론적 롤백에 대한 성능 고려 사항을 존중하는 것은 유니티의 동적 Navmesh 카빙에 대한 절충 사항입니다. 성능 오버헤드가 거의 없는 상태로 사전 정의된 Navmesh 영역을 동적으로 전환하는 데 사용할 수 있습니다.
영역은 삼각형 내부에서 마스크로 인코딩되기 때문에(unsigned long) 맵당 최대 다른 영역 ID 수는 64개(Navigation.Constants.MaxRegions
). 하지만 같은 아이디를 다른 지역에 재사용하는 것은 가능합니다.
메인 Quantum navmesh(Walkable)는 영역이 아니므로 전환할 수 없습니다.
Navmesh 지역 생성하기
단계 1) Quantum 지역은 유니티 navmesh 영역의 piggy-back입니다. 새 영역을 작성합니다. 아래 이미지에서 Toggleable
이라는 이름을 선택했지만 어떤 이름이라도 가능합니다.
전환 가능한 영역이 서로 바로 옆에 있을 때 탐지가 작동하도록 하려면 서로 다른 영역 ID를 사용해야 합니다. 이 경우 여기에 여러 영역을 만듭니다.
단계 2) MapNavMeshUnity
에 새로운 지역을 추가합니다. 그렇지 않으면 베이킹은 어떤 영역을 찾아야 할지 모를 것입니다.
단계 3) Unity는 MeshRenderer
라는 객체를 사용하여 그 지역을 네브메쉬 위에 투영합니다. MeshRenderer
로 GameObject를 만들고 MapNavMeshRegion
을 붙입니다.
Id
는 Map.RegionMap
을 통해 코드에서 액세스할 수 있는 고유한 문자열로 나중에 region id (int, flag)를 얻을 수 있습니다.
CastRegion
은 CastRegion
으로 설정해야 합니다. 이 스크립트는 예를 들어 영역을 탐색망에 투영할 필요가 없는 오프 메시 링크에 재사용됩니다.
NavMeshHelper
에서 GameObject가 올바르게 설정되었는지 다시 확인할 수 있습니다. 예를 들어, static
으로 설정되어 있고 선택한 영역이 우리 영역인지 확인합니다.
navmesh 표면을 장착할 때 인스펙터의 모양이 약간 다릅니다. 예를 들어 NavMesh 영역을 설정하려면 NavMeshModifier
스크립트를 추가해야 합니다.
영역을 가져오는 동안 삼각형을 원래 영역 스크립트와 다시 일치시키려 하며, 이를 위해 메시의 경계 상자를 사용합니다. 생성된 삼각형이 100% 정확하지 않기 때문에 MapNavMeshUnity
의 설정은 피팅 중에 약간의 공간을 추가하는 RegionDetectionMargin
설정을 가집니다. 영역을 내보내지 않았지만 너무 커지면 인접 영역을 감지하는 데 문제가 있을 수 있는 경우 이 값을 늘립니다.
Btw: 지역을 생성하는 MeshRenderer
는 베이킹 동안만 활성화하면 됩니다. 거기에 도구를 추가해야 합니다.
단계 4) 이제 맵을 베이킹하고 영역이 배치된 navmesh의 삼각형 색 영역을 확인합니다.
단계 5) Toggle the region off in code and watch the agent circumventing it.
C#
public override void OnInit(Frame f) {
var regionId = f.Map.RegionMap["foo"];
f.NavMeshRegionMask->ToggleRegion(regionId, false);
}
단계 6) 영역 활성화에 액세스하여 프레임에 저장할 수 있습니다.
새 맵이 로드되면 마스크를 재설정해야 합니다. 예를 들어 ISignalOnMapChanged
신호 중에 FrameBase.ClearAllNavMeshRegions()
을 실행합니다.
C#
public class ResetRegionsSystem : SystemSignalsOnly, ISignalOnMapChanged {
public void OnMapChanged(Frame f, AssetRefMap previousMap) {
f.ClearAllNavMeshRegions();
}
}
NavMeshRegionMask
객체의 API를 확인해 보세요. 다음은 개요입니다:
NavMeshRegionMask.Default
에는 모든 영역이 활성화되어 있습니다(1로 설정).NavMeshRegionMask.ToggleRegion(int region, bool enabled)
은 영역 ID를 기준으로 영역을 전환합니다. 영역 ID는 비트 시프트의 오프셋이며Map.RegionMap
딕셔너리를 사용하여 이름으로 검색할 수 있습니다.NavMeshRegionMask.IsRegionEnabled(int region)
는 영역이 활성 상태인지 확인합니다.NavMeshRegionMask.IsSubset(NavMeshRegionMask)
를 사용하여 한 마스크에서 활성화된 모든 영역이 다른 마스크에서도 활성화되는지 확인할 수 있습니다.NavMeshRegionMask.Clear()
는 모든 영역을 활성으로 설정합니다.NavMeshRegionMask.HasValidRegions
는 마스크에 정확히 하나의 유효한 영역이 설정되어 있을 때 true를 반환합니다.NavMeshRegionMask.IsMainArea
는 마스크가 0인지 확인합니다. 이는 주 탐색 영역에 속하는 삼각형에 해당되며 끌 수 없습니다.