Gameware Navigation を使用するレベルを設定する

このドキュメントでは、Stingray エディタで Gameware Navigation を使用するレベルの設定方法について説明します。以下の追加方法や設定方法を示します。

この目的のために、オートデスクでは一連のユニットを提供しています。core/gwnav/units をご覧ください。

NavWorld ユニット

NavWorld を設定するには、レベル内に navworld ユニットのインスタンスを追加します。

Lua では、NavWorld オブジェクトは GwNavWorld スクリプト データ オブジェクトが含まれているユニット インスタンスを検索し、このオブジェクトに格納されたパラメータを使用して自分自身を自動的に初期化します。

navworld ユニットは以下を設定します。

BotConfiguration

このユニット使用すると、以下を設定できます。

Lua では、NavWorld オブジェクトは GwNavBot スクリプト データ オブジェクトを含むユニットのインスタンスを検索し、GwnavBot/configuration_name を使用してボットを自動的に作成して、ボットの設定に使用する BotConfiguration を取得します。

NavMesh レイヤの許可されているコスト、禁止されているコスト、およびカスタムのコスト

ボットはコスト乗数 1 ですべての NavTag 内を移動できます。ただし、layer_id および layer_cost_multiplier という 2 つのエントリを含むオブジェクトで構成された、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 の NavTag の 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 の一部を一緒に接続できます。通常は、梯子、ジャンプ、クライミング、エレベータなど、2 つの突起を結合する場合に使用します。

エディタ内に NavGraph を配置する場合は、navgraphconnector ユニット(Create パネルまたは Create メニューの Graph Connector ユニット)を使用できます。ユニットを配置して、移動、回転、スケールします。ランタイムで、このユニットは一連の NavGraph を自動的に生成して 2 つの突起を結合します。

GwNavGraphConnector/sampling_step は突起に沿って NavGraph の密度を変更します。

タグ付けは次のスクリプト データによって設定されます:

動的な TagVolume

動的な TagVolume を使用すると、ランタイムで NavMesh に動的にタグ付けすることができます。一般的な例には、炎と煙が伝播しているときに NavMesh にタグ付けするなどがあります。このタグの付いた NavMesh レイヤでは、消防士が煙の中を移動できます。一方、その他のボットは移動できません。もう 1 つの使用例は、NavMesh にスマートオブジェクトをタグ付けして、ランタイムで移動可能なフェンスを越えてジャンプすることです。

動的な TagVolume は、以下を使用して追加できます。

Lua スクリプト TagVolume

API ドキュメント内の「GwNavTagVolume」を参照してください。

次に示すスクリプト データはタグ付けを設定します(GwNavGenTag に配置されているものと同様。「ナビゲーション メッシュを生成する」の「生成時の NavMesh のタグ付け」を参照)。

ユニットの TagVolume の指定

ボックスの TagVolume をユニットに追加して、スクリプトデータ オブジェクト GwNavTagBox を追加します。次の子スクリプト データはボックスの高さ、幅、および奥行きをコントロールします。

次のローカル センターを配置します。* GwNavTagBox/offset/x * GwNavTagBox/offset/y * GwNavTagBox/offset/z

最後に、上記の「NavMesh によるスクリプト データのタグ付け」に従って、GwNavTagBox に子スクリプト データを追加して、タグ付けを指定します。

動的な障害物

障害物は、(移動中などに)回避システムで考慮したり、(移動時に) TagVolume として NavMesh に投影したりできるナビゲーション オブジェクトです。

ボックスの障害物

ボックス障害物をユニットに追加して、スクリプトデータ オブジェクト GwNavBoxObstacle を追加します。

ボックスの高さ、幅、奥行き、およびローカルの中心は、TagVolume と同様に設定できます(「ユニットの TagVolume の指定」を参照)。ただし、次に示す他の 2 つのパラメータがあります。

障害物を任意の軸の周りで自由に回転できる場合は、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 に子スクリプト データを追加して、タグ付けを指定します。