NavData 생성 시스템은 항상 입력 형상에서 제공한 모든 삼각형을 허용하고 고려합니다. 그러면 런타임 시 캐릭터가 액세스할 수 없도록 하려는 영역에 NavData가 생성되는 경우가 많습니다. 예를 들어 지붕 꼭대기, 나무 꼭대기, 폐쇄된 건물 내부 등입니다.
Bot이 도달할 수 없는 이러한 영역 중 하나에 대한 경로를 계획하도록 하지 않는 한 이 추가 데이터는 성능에 문제가 되지 않습니다. 그러나 다른 용도로 사용해야 할 수 있는 추가 메모리 일부를 사용합니다.
필요 없는 데이터를 제외하는 여러 가지 방법을 사용할 수 있으며, 이러한 방법은 다음 섹션에서 설명합니다. 이러한 방법은 단독으로 사용되지 않으며 지세의 다양한 레벨 또는 다양한 영역에서 가장 적합하게 작동하는 모든 프로세스를 사용할 수 있습니다.
각 섹터에 대해 시드 점을 개수에 관계없이 NavData 생성 시스템에 제공할 수 있으며, 이 시드 점은 지세에서 보행 가능 영역을 식별합니다. 섹터에 대해 하나 이상의 시드 점을 제공하는 경우 사후 처리 단계가 NavMesh를 통해 각 시드 점에서 전파됩니다. 해당 시드 점에서 도달할 수 있는 영역을 포함하는 NavMesh만 유지됩니다. 다른 모든 NavData는 무시됩니다.
예를 들어 다음과 같은 지세를 가정해 보십시오. 기본적으로 NavData의 격리된 영역이 모든 지붕 꼭대기와 각 건물 내에 만들어집니다. 내부 NavData는 이미지에 표시되지 않지만 런타임 시 많은 추가 메모리를 사용합니다.
단일 시드 점이 지면의 임의 지점에 배치되면 지면에서 액세스할 수 없는 모든 NavData가 자동으로 무시됩니다. 여기에는 아래에 표시된 대로 모든 지붕 꼭대기와 건물 내부가 포함됩니다.
Navigation Lab에서 시드 점을 만들려면 지세의 아무 데나 마우스 오른쪽 버튼으로 클릭하여 상황별 메뉴에서 Generation > Spawn Seed Point를 선택합니다.
각 섹터를 만드는 경우 해당 섹터에 대해 만든 구성에서 GeneratorSectorConfig::AddSeedPoint() 또는 GeneratorSectorConfig::AddSeedPointInClientCoordinates() 메서드를 호출하여 해당 섹터에 시드 점을 제공할 수 있습니다.
또는 ClientInputConsumer::ConsumeSeedPoint()를 호출하여 GeneratorInputProducer 클래스에서 시드 점을 제공할 수 있습니다.
각 섹터는 해당 구성에서 또는 해당 섹터에 삼각형을 가져오기 위해 GeneratorInputProducer를 호출하는 경우 해당 섹터에 대해 지정한 시드 점만 고려합니다. 따라서
필요 없는 영역을 포함하는 3D 볼륨을 NavData 생성 시스템에 제공하고 해당 볼륨에 보행 불가능한 것으로 플래그를 지정할 수 있습니다. 해당 볼륨 내에 있는 입력 삼각형에 대해서는 NavData가 생성되지 않습니다.
이 예제에서는 지세의 오른쪽에 있는 캠프를 플레이어가 적대적인 NPC의 공격에 대한 두려움 없이 쉴 수 있는 안전한 영역으로 설정하려고 합니다.
이렇게 하려면 안전한 영역을 둘러싸는 TagVolume을 만들고 "독점적"으로 플래그를 지정합니다. 생성된 후에는 NavMesh가 경계에서 중지하여 NPC가 해당 영역에 들어갈 수 없도록 합니다.
Navigation Lab에서 TagVolume을 만들려면
Generator에 대해 TagVolume을 만들려면
각 섹터를 만들면 해당 섹터에 대해 만든 구성의 GeneratorSectorConfig::AddTagVolume() 메서드를 호출하여 해당 섹터에 TagVolume을 제공할 수 있습니다.
또는 ClientInputConsumer::ConsumeTagVolume()을 호출하여 GeneratorInputProducer 클래스에서 TagVolume을 제공할 수 있습니다.
각 섹터는 해당 구성에서 또는 해당 섹터에 삼각형을 가져오기 위해 GeneratorInputProducer를 호출하는 경우 해당 섹터에 대해 지정한 TagVolume만 고려합니다. 따라서
NavData 생성 프레임워크의 API를 직접 사용하는 경우 제외할 영역의 개별 입력 삼각형 각각에 특수 NavTag로 태그를 지정할 수 있습니다. 생성 프로세스 중에 이 지세 유형으로 태그가 지정된 삼각형만 있는 모든 픽셀에는 NavData가 생성되지 않으므로 NPC가 해당 영역을 탐색할 수 없습니다.
이 방법을 사용하려면 GeneratorInputProducer의 사용자 정의 클래스에서 ClientInputConsumer::ConsumeTriangle() 또는 ClientInputConsumer::ConsumeTriangleFromPosInClientCoordinates() 메서드를 사용하여 ClientInputConsumer에 각 입력 삼각형을 제공해야 합니다. 인수 목록에서 제공한 DynamicNavTag를 해당 DynamicNavTag::SetAsExclusive() 메서드를 호출하여 독점적인 상태로 만든 이러한 메서드로 설정합니다.
필요한 경우 삼각형이 정적 장애물로 고려되도록 하려면 해당 삼각형을 생성 시스템에 전달할 때 단순히 생략하는 대신 이 지세 유형 메커니즘을 사용하는 것이 좋습니다.
NavMesh의 부분에 대해 최소 표면 영역을 설정할 수 있습니다. NavData 생성 후 사후 처리 단계는 이 임계값보다 작은 표면 영역이 있는 NavFloor를 무시합니다.
이 설정은 서로 연결되지 않고 캐릭터에서 가로지를 수 없는 작은 격리된 영역이 NavMesh에 많이 포함되어 있는 경우에 유용할 수 있습니다.
인접한 섹터에서 NavData와의 일관성을 보장하려면 인접한 섹터와 겹치는 영역에 닿는 NavMesh의 모든 영역을 항상 유지합니다. 따라서 인접한 두 섹터 간 테두리의 오른쪽에 작은 지붕 꼭대기가 있으면 예상대로 필터링되지 않을 수 있습니다.
이 테스트 지세에서는 경사진 지세의 로컬 변형으로 인해 캐릭터가 런타임 시 이동할 필요가 없는 연결되지 않은 작은 영역이 여러 개 생성됩니다.
최소 표면 영역 임계값을 올리면 주변 NavData의 특징에 영향을 주지 않고 해당하는 작은 영역의 모든 NavData가 자동으로 무시되도록 할 수 있습니다.
최소 표면 매개변수를 사용하여 일반적으로 필터링되는 표면에 시드 점이 있는 경우 표면이 노이즈로 간주될 만큼 작지 않는 한(예: GeneratorAdvancedParameters:: m_noiseReductionSurface 매개변수보다 작음) 시드 점을 포함하는 표면이 유지됩니다. 아래를 참조하십시오.
GeneratorInputOutput.m_params.m_advancedParameters를 통해 액세스할 수 있는 GeneratorAdvancedParameters::m_minNavigableSurface 구성원의 값에서 표면 영역 임계값을 설정할 수 있습니다.
위에서 설명한 GeneratorAdvancedParameters::m_minNavigableSurface 매개변수 외에 노이즈 감소를 제어하기 위해 다른 매개변수인 GeneratorAdvancedParameters::m_noiseReductionSurface가 사용됩니다. 두 번째 매개변수는 다음을 제외하면 효과면에서 유사합니다.
대부분의 프로젝트에서 GeneratorAdvancedParameters::m_minNavigableSurface 매개변수를 조정하고 GeneratorAdvancedParameters::m_noiseReductionSurface 매개변수를 기본값으로 유지하는 것이 좋습니다. 그러나 최상의 성능과 일관성을 위해 GeneratorAdvancedParameters::m_noiseReductionSurface의 값이 일반적으로 GeneratorAdvancedParameters::m_minNavigableSurface 값보다 낮게 유지되므로 GeneratorAdvancedParameters::m_minNavigableSurface를 매우 낮은 값으로 설정하는 경우 해당 값을 직접 낮추어야 할 수 있습니다.