NPC・敵の巡廻ルートを変更する[Unity]
特定のルートを巡廻する際、ルートを変更したくなるケースが有ります。例えば「人が詰まっていて通行できない」ようなケース、「障害物が置いてあり通過出来ない」ケース、「ステージが変化し最短ルートが変更された」ケース等々です。
メッシュに移動コストを変更する
移動にNavmeshを使用している場合、手っ取り早い方法がコストを変更する事です。コストを変更すれば、移動コストが高いルートは選択されなくなくなり、コストの低いルートが選択されるようになります。
どちらかと言えば、「このルートを通過してほしくない」時に便利です。
コスト製の問題は、プロジェクトでコストを共有してしまう&レイヤー数に制限がある点と、全オブジェクトに対してコストを指定してしまう点です。
特にレイヤー数の制限は少しシビアなので、場合によってはシーン毎にレイヤー設定を上書きするようなコンポーネントが必要になるかもしれません。
移動パスを変更する
もう一つが、パスの位置自体を変更してしまう方法です。
例えば1〜4の順番でパスを巡廻するならば、その途中パスを調整してしまえば経路が調整する事ができます。
下の例では「パス2」の位置を「2−1」「2−2」「2−3」の位置へ調整する機能を付与しています。
これの問題は、パスの調整が面倒くさい点にあります。コストと違い、全ルートを把握する必要があり、また経路が複雑になる場合、各ノードの重みを設定し最低コストのパスを選択する…という、なんか二重に経路探索するような実装が必要になります。*1
サンプル
今回、サンプルプロジェクトも作りました。高いコストを避けるサンプルと、特定のパスを通過するサンプルが含まれます。
tsubaki/UnityNvmeshCostsample · GitHub
それと巡廻方法はこちら
特定ルートを巡回したりする方法[Unity] - テラシュールブログ
*1:とはいえポイントレベルなのでかなり簡単な実装でOKですが