Gameware Navigation のほとんどのコンポーネントとサブシステムは NavData に依存しています。NavData とは、高性能な空間クエリおよびパス ファインディングをサポートするためにモデル化された、ゲームの地形ジオメトリの抽象的な表現を提供する World 内のデータ構造のセットです。
NavData はゲームの AI にとって重要なリソースです。移動できる場所と移動できない場所についてキャラクタに通知し、最終的にキャラクタの決定と動作のベースを提供します。このように、Gameware Navigation を最大限に活用するには、ゲーム ワールドを正確にマップする NavData を使用することが不可欠です。
この章では、NavData の詳細と、効率的にプロジェクトの要求に合ったゲーム ワールドの NavData を生成する方法を説明します。
キャラクタは NavData を使用してゲーム ワールドの移動可能な範囲について決定します。したがって、NavData を使用するキャラクタの物理的属性と移動能力を反映する必要があります。異なる寸法のキャラクタ、またはまったく異なる方法で移動するキャラクタには、まったく異なる NavData が必要になる場合があります。たとえば、ワールド内で人間が移動できる場所の表現は、自動車、または恐竜が同じワールド内で移動できる場所の表現として有効ではありません。
キャラクタの種類によってプロポーションが異なる場合は、移動の可能性を表すために異なる NavData のセットが必要になる場合があります。キャラクタのプロポーションがよく似ていて、実行時にゲーム内で異なるモーション パスが生成されない場合は、両方の種類のキャラクタで NavData の 1 つのセットを共有することで、メモリを節約できます。ただし、これを行う場合は、常に大きい方のキャラクタに合わせて生成する必要があります。
「複数の Database を使用する」を参照してください。
次のセクションでは、Gameware Navigation で使用される NavData の主なタイプ、NavMesh と NavGraphs を紹介します。
NavMesh は、地上を歩行するキャラクタが移動できる静的な 3D ワールド内の範囲を表します。NavMesh は接続された一連のトライアングルで構成され、キャラクタが自由に歩き回ることのできる範囲を定義します(NavMesh の内側)。NavMesh のトライアングルで示されていない範囲は、「NavMesh の外側」と呼びます。普通の状況では、パス追従中に Gameware Navigation がキャラクタを NavMesh の外側に移動させることはありません(NavGraphs の使用による例外は下記参照)。
次のイメージは、NavMesh を視覚的に表したものです。NavMesh の色の付いたトライアングルは、地形の歩行可能エリアを埋め尽くすサーフェスを形成することに注目してください。NavMesh の境界が壁や静的な障害から少し離れていることにも注目してください。この距離は、NavMesh を使用するキャラクタの幅の約半分に相当します。キャラクタの中心(キャラクタの位置として想定される場所)が静的な障害に対してこの距離より近くまで移動しないようにすることで、静的な障害との衝突の可能性を避けることができます。
NavMesh は基本的に 2 次元のサーフェスですが、複数階の床や螺旋階段などの 3 次元の複雑なエリアも完全にサポートします。
Gameware Navigation のパス ファインディングおよびパス フォローイング システムは、主に地形の静的および動的オブジェクトの位置を決定するためや、2 点間の直線パス上にどんな障害物があるかを見つけ出すために NavMesh を使用します。これは、キャラクタがパスを滑らかにしようとするとき、またはパスに沿って離れた点までのショートカットを探そうとするときに便利です。NavMesh がない場合は、キャラクタが自分とワールド内の別の場所の間に障害が存在するかどうかを知るには、手間のかかるレイ キャストと衝突テストを物理ワールドに対して行うしか方法はありません。NavMesh を使用すると、Bot および他のコンポーネントがゲーム ワールド内で実行する必要のあるこのような手間のかかるテストの数が減るので、パス ファインディング システムのパフォーマンスが大幅に向上します。
また、NavMesh にユーザ独自の高性能な空間クエリを実行して、最適化された空間化をユーザ独自のコード内でユーザ独自の目的に利用することができます。詳細は、「クエリ システムを使用する」を参照してください。
前のイメージで NavMesh のトライアングルの色がエリアによって異なることに注目してください。これらの色は、異なるタイプの地形を表すためにトライアングルに割り当てられている NavTags と呼ばれるユーザ定義のデータ値が異なっていることを表します。キャラクタのパス ファインディングを設定して、キャラクタが移動できる、または移動できない地形の種類を指定するためにこれらのタグを利用できます。また、これらのタグをエリア内のキャラクタのパス フォローイングをコントロールするスマート オブジェクトに関連付けることができます。詳細は、「カスタム データでタグ付けする」を参照してください。
NavMesh のトライアングルは、ほぼ地面と同じ高度に配置されています。ただし、デフォルトでは三角形の高度は地面の高度の近似としてのみ使用されるので、ビルディングの複数の階のような複数の重なり合った移動可能なエリアを十分に区別できます。NavMesh は部分的には地面の下を通過する場合もあります。
物理システムを使用せずにキャラクタを地面にクランプするなどの別の目的のために NavMesh の高度を使用する場合は、NavMesh が地形メッシュの高度に合わせる際の精度が高くなるように NavData 生成システムを設定することができます。詳細は、「高度の精度を上げる」を参照してください。
NavGraphs はエッジで接続されている 3D 空間内の位置にある頂点で構成されている空間構造です。NavGraphs を利用することで、NavMesh の分離されたエリアにあるポイント間に、エレベータ、ジャンプ スポット、テレポータなどの新しいトポロジの接続を作成することができます。通常、NavGraphs はスマートオブジェクトにリンクされます。スマートオブジェクトはそのエッジを移動するキャラクタの能力をコントロールするもので、キャラクタがエッジを移動するときは、キャラクタのモーションを完全にコントロールします。「スマート オブジェクトを作成する」を参照してください。
NavGraph のエッジは NavMesh の境界を越えることができ、また、NavMesh の外側にある頂点が含まれている場合があります。2 つの頂点間に 1 つのエッジがあるような単純なものになることも、ジップラインのように NavMesh 外ナビゲーションの可能性をもつ複雑なネットワークが形成されることもあります。
たとえば次のイメージでは、矢印は地面上のポイントと屋根上のポイントを接続する NavGraph エッジを表します。これらは、ジャンプ アニメーションを再生したりカスタム モーション パスを計算したりして、エッジの 1 つに沿ったパスをプランするキャラクタのパス フォローイングを管理するスマート オブジェクトに関連付けることができます。
NavGraphs は、ゲーム内で特殊な移動のタイプやスマート オブジェクトが必要な場合に NavData に対して作成して追加する NavMesh のオプションの拡張機能です。NavData 生成システムが自動的に NavGraphs を作成することはありません。NavGraphs はデータ生成プロセス(通常はセクタの NavMesh を生成した後に実行する後処理フェーズ)で手動で作成するか、実行時に動的に作成します。「NavGraph を作成する」を参照してください。
上で説明した NavMesh と NavGraphs は、静的なデータ構造であり、地形に対してあらかじめ生成しておき、実行時にメモリにロードされるものです。ただし、TagVolumes、BoxObstacles、および CylinderObstacles などのダイナミック要素を使用して、ゲーム中に各 World 内の静的な NavData を充実させ修正することができます。
詳細は、「動的な障害物や TagVolume を使用する」を参照してください。