テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

NPC・敵の巡廻ルートを変更する[Unity]

特定のルートを巡廻する際、ルートを変更したくなるケースが有ります。例えば「人が詰まっていて通行できない」ようなケース、「障害物が置いてあり通過出来ない」ケース、「ステージが変化し最短ルートが変更された」ケース等々です。

 

メッシュに移動コストを変更する

移動にNavmeshを使用している場合、手っ取り早い方法がコストを変更する事です。コストを変更すれば、移動コストが高いルートは選択されなくなくなり、コストの低いルートが選択されるようになります。

どちらかと言えば、「このルートを通過してほしくない」時に便利です。


状況により移動するルートを変更する - テラシュールブログ

 

コスト製の問題は、プロジェクトでコストを共有してしまう&レイヤー数に制限がある点と、全オブジェクトに対してコストを指定してしまう点です。

特にレイヤー数の制限は少しシビアなので、場合によってはシーン毎にレイヤー設定を上書きするようなコンポーネントが必要になるかもしれません。

 

移動パスを変更する

もう一つが、パスの位置自体を変更してしまう方法です。

例えば1〜4の順番でパスを巡廻するならば、その途中パスを調整してしまえば経路が調整する事ができます。

下の例では「パス2」の位置を「2−1」「2−2」「2−3」の位置へ調整する機能を付与しています。

f:id:tsubaki_t1:20141006235711p:plain

これの問題は、パスの調整が面倒くさい点にあります。コストと違い、全ルートを把握する必要があり、また経路が複雑になる場合、各ノードの重みを設定し最低コストのパスを選択する…という、なんか二重に経路探索するような実装が必要になります。*1

 

サンプル

今回、サンプルプロジェクトも作りました。高いコストを避けるサンプルと、特定のパスを通過するサンプルが含まれます。

tsubaki/UnityNvmeshCostsample · GitHub

 

f:id:tsubaki_t1:20141007000140p:plain

 

それと巡廻方法はこちら


特定ルートを巡回したりする方法[Unity] - テラシュールブログ

*1:とはいえポイントレベルなのでかなり簡単な実装でOKですが