加算読み込みを使用して複数の NavMesh を読み込む
ナビメッシュエージェント

NavMesh Agent を他のコンポーネントと共に使う

NavMesh Agent、NavMesh Obstacle、Off Mesh Link コンポーネントは、他の Unity コンポーネントと共に使えます。以下に、複数のコンポーネントを合わせて使用する際の推奨・非推奨の使い方を紹介します。

NavMesh Agent と Physics

  • NavMesh Agent 同士を衝突させるために物理コライダーを追加する必要はありません。
  • ナビゲーションシステムはエージェントと、障害物/静的ナビメッシュ(ベイクされた NavMesh)に対するエージェントの反応をシミュレートします。
  • NavMesh Agent に物理オブジェクトを押させたり、物理トリガーを使わせたりしたい場合:
  • Collider コンポーネントを追加する(まだ追加していない場合)
  • Rigidbody コンポーネントを追加する
    • kinematic(Is Kinematic) をオンにする (重要!)
    • Kinematic はリジッドボディが物理シミュレーション以外のものに操作されることを示すものです
  • NavMesh Agent と Rigidbody (Kinematic なし) が共にアクティブな状態では、競合状態が生じます
  • この場合、両コンポーネントが同時にエージェントを動かそうとするため、定義外の挙動が引き起こされます
  • NavMesh Agent はプレイヤーキャラクターなどを物理シミュレーションなしで利用できます
  • プレイヤーエージェントの回避優先度として小さな数字(高優先度)を指定しておけば、プレイヤーは群衆の中を通り抜けさせられます NavMeshAgent.velocity を使ってプレイヤーエージェントを動かすと、他のエージェントがプレイヤーの動きを予測できるようになるため、プレイヤーを避けるよう動作するようになります

NavMesh Agent と Animator

  • NavMesh Agent と Root Motion を持つ Animator は競合を引き起こす場合があります
  • 毎フレーム、両コンポーネントがトランスフォームを動かそうと試みるためです
  • 解決策は 2 つあります
  • 原則: 情報のフローは常に一方向にする
  • エージェントがキャラクターを動かし、アニメーションがそれに続く
  • またはアニメーションが、シミュレーションの結果に基いてキャラクターを動かす
  • これ以外の手法を採用すると、デバッグの難しいフィードバックループとなってしまいます
  • アニメーションがエージェントに追従する場合
  • NavMeshAgent.velocity を Animator への入力とし、エージェントの移動をおおまかにアニメーションに合わせる
  • 堅牢でシンプルな実装になるものの、アニメーションと移動速度が一致しない場合に足がすべるような結果になります
  • エージェントがアニメーションを追従する場合
  • NavMeshAgent.updatePosition および NavMeshAgent.updateRotation を無効化して、シミュレーションをゲームオブジェクトの位置から切り離します
  • エージェント位置のシミュレーション結果 (NavMeshAgent.nextPosition ) とアニメーションのルート (Animator.rootPosition ) の差分を用いてアニメーションの制御を計算します
  • 詳細については アニメーションとナビゲーションの組み合わせを参照してください

NavMesh Agent と NavMesh Obstacle

  • 正しく機能しない組み合わせです。
  • 両方を有効にすると、エージェントが自身を避けようとし始めます
  • さらに carving が有効になっている場合には、エージェントが carving の穴の端に対するリマップを試行し続けるため、さらに意図しない行動が引き起こされます
  • 必ず、いずれか一方のみがアクティブになるようにしてください
  • Agent をオフにして Obstacle をオンにすると、他の Agent が避けるように強制できます
  • Alternatively you can use priorities to make certain agents to be avoided more

NavMesh Obstacle と物理挙動

  • 物理制御付きオブジェクトが NavMesh Agent の行動に干渉できるようにしたい場合:
  • エージェントに認識させたいオブジェクトに NavMesh Obstacle コンポーネントを追加します。これで回避システムが対象 Obstacle を回避対象として判断できるようになります
  • ゲームオブジェクトに Rigidbody と NavMesh Obstacle が追加されている場合、対象 Obstacle の velocity は Rigidbody から自動的に取得されます
  • このため、NavMesh Agent は移動する障害物を予測・回避できます
加算読み込みを使用して複数の NavMesh を読み込む
ナビメッシュエージェント