Gameware Navigation을 사용하도록 수준 설정

이 문서에서는 Stingray 편집기에서 Gameware Navigation을 사용하도록 수준을 설정하는 방법을 설명합니다. 다음을 추가하고 구성하는 방법을 알아봅니다.

이를 위해 Autodesk에서는 유닛 세트를 제공하며 core/gwnav/units에서 찾아볼 수 있습니다.

NavWorld 유닛

NavWorld를 구성하려면 수준에 navworld 유닛의 인스턴스를 추가합니다.

Lua에서 NavWorld 오브젝트는 GwNavWorld 스크립트 데이터 오브젝트를 포함한 유닛 인스턴스를 찾으며, 이 오브젝트에 저장된 매개변수에서 자동으로 자체 초기화합니다.

navworld 유닛은 다음을 구성합니다.

BotConfiguration

이 유닛으로 다음을 구성할 수 있습니다.

Lua에서 NavWorld 오브젝트는 GwNavBot 스크립트 데이터 오브젝트를 포함하는 유닛 인스턴스를 찾고 GwnavBot/configuration_name을 사용해 자동으로 봇을 생성하여 봇을 설정하는 데 사용할 BotConfiguration을 검색합니다.

허용되거나, 금지되거나, 사용자 정의된 navmesh 레이어 비용

봇은 1의 승수 비용으로 모든 navtag를 통과하도록 허용합니다. 2개 항목(layer_idlayer_cost_multiplier)의 오브젝트로 구성된 navtag_layers에 지정되어 있는 것은 제외합니다.

layer_id는 navtag의 layer_id 구성요소를 나타냅니다. 이는 생성 시(탐색 메시 생성 아래 "생성 시 NavMesh 태그 지정" 참조) 또는 런타임 시(아래의 NavMesh 태그 지정 스크립트 데이터 참조) 설정할 수 있습니다.

layer_cost_multiplier는 이러한 레이어 횡단 시 적용할 비용이며, 음수 또는 null 비용일 경우 레이어의 횡단이 금지됩니다.

예를 들어 다음 예에서 layer_id 1이 포함된 navtag는 존재하지 않으므로 1을 곱한 횡단 거리 비용이 듭니다. layer_id 0을 포함한 navtag는 layer_id 1보다 2배의 비용이 듭니다. layer_id 2를 포함한 navtag는 횡단이 불가능합니다.

navtag_layers = [
  {
    layer_id = 0,
    layer_cost_multiplier = 2
  },
  {
    layer_id = 2,
    layer_cost_multiplier = -1
  },
}


    > **Note:** Allowed, forbidden, or custom costs can be changed at runtime with Lua functions. Navgraph can also contain a layer_id.

NavGraph

Navgraph를 통해 NavMesh의 부분을 연결할 수 있습니다. 일반적으로 사다리, 점프, 위로 올라가기, 엘리베이터 등 두 개의 돌출부를 연결하려는 경우 사용하게 됩니다.

편집기에 NavGraph를 배치하면 navgraphconnector 유닛(Create 패널 또는 Create 메뉴에 위치한 Graph Connector 유닛)을 사용할 수 있습니다. 유닛을 배치한 다음 해석하고, 회전하고, 배율을 조정합니다. 런타임 시 이 유닛은 자동으로 NavGraph 세트를 생성하여 두 개의 돌출부를 연결합니다.

GwNavGraphConnector/sampling_step은 돌출부를 따라 navgraph 밀도를 변경합니다.

다음 스크립트 데이터는 태그 지정을 설정합니다.

동적 TagVolume

동적 TagVolume은 런타임 시 동적으로 NavMesh에 태그를 지정하도록 허용합니다. 일반적인 예는 불과 연기가 번지는 상황에 대해 NavMesh에 태그를 지정하는 것입니다. 태그에서 navmesh 레이어는 소방관이 연기 속을 탐색하고 다른 봇은 할 수 없게 합니다. 또 다른 적용 예는 NavMesh에 런타임 시 이동할 수 있는 울타리를 뛰어넘도록 smartobject와 함께 태그를 지정하는 것입니다.

동적 TagVolume은 다음을 통해 추가할 수 있습니다.

Lua 스크립팅 TagVolumes

API 문서에서 GwNavTagVolume을 참조하십시오.

다음 스크립트 데이터는 태그 지정을 설정합니다(GwNavGenTag에 들어가는 것과 유사함, 탐색 메시 생성 아래 "생성 시 NavMesh 태그 지정" 참조).

유닛을 위한 TagVolume 지정

스크립트 데이터 오브젝트 GwNavTagBox를 추가하여 유닛에 상자 TagVolume을 추가합니다. 다음 하위 스크립트 데이터는 상자의 높이, 폭, 깊이를 제어합니다.

로컬 중심 배치: * GwNavTagBox/offset/x * GwNavTagBox/offset/y * GwNavTagBox/offset/z

그리고 최종적으로 위의 NavMesh 태그 지정 스크립트 데이터에 설명된 것과 같이 GwNavTagBox에 하위 스크립트 데이터를 추가하여 태그를 지정합니다.

동적 장애물

장애물이란 방지 시스템에서 고려하거나(움직이는 경우) TagVolume으로 NavMesh에 반영되는(움직이지 않는 경우) 탐색 오브젝트입니다.

상자 장애물

스크립트 데이터 오브젝트 GwNavBoxObstacle을 추가하여 유닛에 상자 장애물을 추가합니다.

상자의 높이, 폭, 깊이 및 로컬 중심을 TagVolume와 유사하게 설정할 수 있습니다. 유닛을 위한 TagVolume 지정을 참조하십시오. 그러나 두 가지 다른 매개변수가 있습니다.

장애물이 모든 축 주변을 자유롭게 회전할 수 있는 경우 GwNavBoxObstacle/rotation_modefree로 설정합니다. 물리적 장애물이 이러한 예입니다. 차량과 같이 장애물이 주로 요 주변을 회전하는 경우 yaw(기본)로 설정합니다.

장애물이 TagVolume을 트리거하도록 하려는 경우 스크립트 데이터 GwNavBoxObstacle/does_trigger_tag_volume를 true로 설정합니다. false로 설정하는 경우 장애물은 방지 시스템에서만 고려됩니다. 이후 NavBoxObstacle:set_does_trigger_tagvolume Lua 함수로 변경할 수 있습니다.

그리고 최종적으로 위의 NavMesh 태그 지정 스크립트 데이터에 설명된 것과 같이 GwNavBoxObstacle에 하위 스크립트 데이터를 추가하여 태그를 지정합니다.

원통 장애물

스크립트 데이터 오브젝트 GwNavCylinderObstacle을 추가하여 유닛에 원통 장애물을 추가합니다.

다음 하위 스크립트 데이터는 원통의 높이와 반지름을 제어합니다(유닛의 루트 위치는 원통의 아래 부분임).

장애물이 TagVolume을 트리거하도록 하려는 경우 스크립트 데이터 GwNavCylinderObstacle/does_trigger_tag_volumetrue로 설정합니다. false로 설정하는 경우 장애물은 방지 시스템에서만 고려됩니다.

그리고 최종적으로 위의 NavMesh 태그 지정 스크립트 데이터에 설명된 것과 같이 GwNavBoxObstacle에 하위 스크립트 데이터를 추가하여 태그를 지정합니다.