Gameware Navigation は、World 内の動的な障害物と破壊可能な障害物の存在を処理する 2 通りの方法を提供します。どちらの方法を使用するかは、障害物が移動しているかどうかによって異なります。
Bot がデフォルトの Trajectory クラスを使って、現在のターゲット ポイントへ移動する速度を生成する際に回避を有効にしている場合、回避システムによって、Bot と衝突する可能性がある、近接する動く障害物が検索されます。近接する衝突オブジェクトとその速度に基づいて、回避システムは、Bot が衝突を回避できる、安全な速度を見つけようとします。パス フォローイング システムの詳細については、「パス ファインディングとパス フォローイング」を参照してください。
動的に変更された NavMesh は、ゲーム内にストリーミングされた、事前生成済みの NavMesh に置き換えられます。Bot が使用するパス ファインディング クエリなど、Databaseに対して実行されたクエリでは、事前生成済みの NavMesh ではなく、動的に変更された NavMesh が自動的に考慮されます。
障害物を表すために使用できるクラスには、次の 3 種類があります。
TagVolume クラスは、動かない物理的な障害物、またはその範囲が常に NavMesh に統合される抽象ゾーンを表します。
各 TagVolume は、オブジェクトの初期化で設定した NavTag で覆われた NavMesh のエリアにタグを付けます。この NavTag は「排他的」としてフラグを付けることができます。これは、移動できないエリアをマークするフラグで、実際には NavMesh 内に穴を開けます。別の方法として、整数データ値のカスタム配列を使って範囲にタグを付けることもできます。これにより、パスファインディング、パス フォローイング、およびクエリ実行時に、この値の取得と処理が可能です。NavTag システムの詳細については、「カスタム データでタグ付けする」を参照してください。
たとえば、右の TagVolume には排他的としてフラグが設定されています。左側では、カスタム データを使って NavMesh にタグが付けられています。デフォルトでは歩行可能ですが、パス追従時に NavTag を検出し、対応することができます。
詳細は、「TagVolume を設定する」を参照してください。
CylinderObstacle クラスは、1 つの円柱として表すのがベストな、移動可能な物理オブジェクトを表します。
デフォルトでは、これらのオブジェクトは、ダイナミック回避システムによってのみ考慮されます。その代わり、オブジェクトが固定状態になると、オブジェクトを NavMesh に統合するように要求することが簡単にできます。これは、内部 TagVolume を透過的にスポーンすることで実行できます。
たとえば、左側にあるオレンジ色の複数の円柱は移動していて、ダイナミック回避でのみ考慮されます。他の円柱は固定状態で、NavMesh に統合されます。グレーのエリアの円柱には、排他的と設定された NavTag が付けられていて、緑色のエリアの円柱にはカスタム データ値が設定された NavTag が付けられています。
詳細は、「CylinderObstacles を設定する」を参照してください。
BoxObstacle クラスは、範囲が固定され、ボックス型のボリュームを持つ、移動可能な、または自由に回転する物理オブジェクトを表します。
デフォルトでは、これらのオブジェクトは、ダイナミック回避システムによってのみ考慮されます。その代わり、オブジェクトが固定状態になると、オブジェクトを NavMesh に統合するように要求することが簡単にできます。これは、内部 TagVolume を透過的にスポーンすることで実行できます。
たとえば、左側にあるオレンジ色の複数のボックスは移動と回転が自由なため、ダイナミック回避でのみ考慮されます。他のボックスは固定状態で、NavMesh に統合されます。グレーのエリアのボックスには、排他的として設定された NagTag が付けられています。茶色のエリアのボックスには、カスタム データ値を持つ NavTag が付けられています。
詳細は、「BoxObstacle を設定する」を参照してください。
TagVolume を NavMesh に統合すると、計算能力が強化されます。CPU のピークを回避するため、この処理は自動的にタイムスライスされますが、新しい TagVolume が NavMesh に直ちに統合されるという保証はありませんし、特定のフレーム数内に統合されるという保証すらありません。