卒業研究の VR 空間を作るのに、ゲームエンジンの Unreal Engine 4 を使っているのですが、Nav Mesh を使った移動でプレイヤーが特定のキャラクターより先に移動できないようにする方法が必要になりました。
調べてみると Navigation Invoker というコンポーネントで動的に Nav Mesh の範囲を変更できるのですが、日本語の記事が見当たらなかったのでまとめます。
バージョンは 4.23 です。
Navigatioin Invoker を使う
Navigation Invoker は 4.8 から追加された機能で、効率的に Nav Mesh をレンダリングし、オープンワールドのような広大なフィールドで使うことを想定しているようです。
Unreal Engine 4.8 リリースノート | Unreal Engine ドキュメント
一見するととても使えそうな機能ですが、なぜか記事がありません。おかげで調べるのに大変苦労しました。
Navigation Invoker を使うには従来と同じく Nav Mesh Bounds Volume をレベルに配置します。
範囲もプレイヤーに移動させたい大きさに指定します。この時 P キーを押すと Nav Mesh の範囲が緑色で表示されます。
Navigation Invoker では、プロジェクト設定 > エンジン >
ナビゲーションシステムからGenerateNavigationOnlyAroundNavigationInvokers
を有効にする必要があります。
また Nav Mesh を動的に生成するため、プロジェクト設定 > エンジン >
ナビゲーションメッシュからRuntime Generation
をDynamic
に変更します。
GenerateNavigationOnlyAroundNavigationInvokers
を有効にした段階で、P キーをいくら押しても Nav Mesh
の範囲が表示されなくなります。
この状態で Nav Mesh を動的に生成したいキャラクターに Navigation Invoker コンポーネントを追加すると、キャラクターの周りに Nav Mesh の範囲が表示されるようになります。
キャラクターを移動させると Nav Mesh もキャラクターにあわせて移動します。
Nav Mesh の大きさは Navigation Invoker のTile Generation Radius
とTile Removal Radius
から指定できますが、あまり小さいサイズにはできないようです(10m x 10m
がぐらい最小?)。
以下の動画が参考になります。
Navigation Invoker の存在を知って嬉々としてたのですが、3m x 3m ぐらいまで範囲を絞りたかったので結果的には実現したいことができませんでした。
また別のアプローチを探す必要がありますが、同じように困っている人に向けて残しておきます。