正確にキャラクタを配置するための Height Mesh ビルディング
加算読み込みを使用して複数の NavMesh を読み込む

ナビゲーションエリアとコスト

Navigation Areas は、特定のエリアを歩いて渡ることがいかに困難を定義します。低コストのエリアは、経路探索の際に好まれて選択されます。また、各 NavMesh エージェントが移動できるエリアを指定するために使用する Area Mask を持っています。

上記の例において、エリアタイプは、2つの一般的な使用事例のために使われています。

  • Water エリアは、浅瀬を歩くのは遅い、というシナリオに対処するために、それより高いコストを割り当てることで、歩くことが、より高くつくようになります。
  • Door エリアは、特定のキャラクタによってアクセス可能になり、人間がドアを通り抜けることができますが、ゾンビにはそれができないシナリオを作成します。

エリアタイプは NavMesh ベイクに含まれるすべてのオブジェクトに割り当てられることができ、そのうえに、各々 Off-Mesh Link はエリアタイプを指定するためのプロパティーを持っています。

Pathfinding コスト

簡単に言えば、コストは、経路を見つけるとき、パスファインダーがどのエリアを支持するかについてコントロールすることができます。たとえば、エリアのコストを 3.0 に設定した場合、そのエリア上を移動するには他のルートの3倍以上長いと考えられます。

どのようにコストが働くかについて完全に理解するために、パスファインダーがどのように働くかを見てみましょう。

 pathfinding 中に訪問したノードとリンクしています。
pathfinding 中に訪問したノードとリンクしています。

Unity は NavMesh の最短経路を計算するために、A* を使用しています。A* は、接続されたノードのグラフ上で動作します。アルゴリズムは、経路の始まりにもっとも近いノードから開始し、目的地に到達するまで、接続ノードを訪問します。

Unity のナビゲーションの表現はポリゴンのメッシュであるので、パスファインダーが行う必要がある最初の事は、各ポリゴンの上にノードの位置である点を配置することです。最短経路は、これらのノード間で計算されます。

上記の絵の中の黄色の点や線は、ノードとリンクがどのように NavMesh 上に置かれるかについて示しており、それらは A* の間で横断する方法を示しています。

2つのノード間を移動するためのコストは、移動する距離およびリンクの下のポリゴンのエリアタイプと関連したコスト、つまり、distance* cost に依存依存します。実際には、エリアのコストが 2.0 であれば、このようなポリゴンを横切る距離が2倍長いように見えることをこのことは意味します。A* アルゴリズムは、すべてのコストが 1.0 よりも大きくなければならないことを要求します。

コストの結果として生じる経路に対する効果は影響は、特により長い経路のために、チューニングが難しくなることもありえます。コストにアプローチする最良の方法は、ヒントとして扱うことです。たとえば、エージェントがあまり頻繁に Off-Mesh Links を使用しないようにする場合、それらのコストを増大させる可能性があります。しかし、それはエージェントが歩道の上を好んで歩くようにふるまうように調整することは挑戦的なことです。

もう一つのいくつかのレベル上で気がつくかもしれないことは、パスファインダーはその最短経路を必ずしも選択しないということです。この理由は、ノードの配置にあります。大きい開放的なエリアが小さい障害物の隣にあるシナリオで、効果は目立つことががありえます。そして、これは非常に大小さまざまなポリゴンでナビゲーションメッシュをもたらします。このような場合、大きなポリゴン上のノードは、大きなポリゴンのどこにでも配置することができ、パスファインダーの視点からは、それは回り道のように見えます。

area type あたりの cost は、Areas タブでグローバルに設定できます。または、スクリプトを使用して、エージェントごとに、それらを無効にすることができます。

Area Types

エリアタイプは、Navigation WindowAreas タブで指定されています。29のカスタムタイプ、3つのビルトインタイプがあります。: WalkableNot WalkableJump です。

  • Walkable - は一般的なエリアのタイプです。どのエリアの上を歩くことができることかを指定します。
  • Not Walkable は、ナビゲーションを防止する、一般的なエリアのタイプです。それは それの上で NavMesh を取得せず、特定のオブジェクトを障害物としてマークしたい場合に便利です。
  • Jump は、すべての auto-generated Off-Mesh Links に割り当てられているエリアのタイプです。

異なるエリアタイプの数個のオブジェクトが重複する場合、結果として生じる NavMesh エリアタイプは、たいてい、索引で最高位にあるものになります。ただし、例外があり、Not Walkable に常に優先権があります。これは、エリアを遮断する必要がある場合に役に立ちます。

Area Mask

各々のエージェントは、ナビゲートするときに、それがどのエリアを使うことができるかについて述べる Area Mask を持っています。エリアマスクは、エージェントプロパティーで設定することができます。または bitmask が、実行時にスクリプトを使用してナビゲートすることができます。

特定のタイプのキャラクタだけがエリアを歩くことができるようにしたいときには、エリアマスクは役に立ちます。例えば、ゾンビを回避するゲームで、Door エリアタイプと各ドアの下のエリアをマークし、ゾンビのキャラクターの Area Mask から、Door エリアのチェックをはずことができます。

参考文献

正確にキャラクタを配置するための Height Mesh ビルディング
加算読み込みを使用して複数の NavMesh を読み込む