UE4 - NavigationMeshのランタイムビルドにかかるコストを減らす
デジゲー博はとても楽しかったです。
次は出展者として参加したいですねぇ。
今回のネタは「ゲーム中に状態が変化して NavigationMesh のビルドにかかる時間がボトルネックになるから対処しよう」です。
アンサーハブでも嘆いている人がいますね。
Navigation Mesh Rebuild At Runtime causing 20-40 fps loss - UE4 AnswerHub
でも先に言っておきます。
ぶっちゃけ効能を実感できなかった
というのも、簡素な作りのレベルだからだと思いますが、そもそも自分の環境では今回の手法を取り入れなくてもボトルネックになっていなかったのです。
逆にどれくらい複雑にしたらボトルネックになってくるのか知りたいくらいです。
とはいえ、自分がテストした環境がアレだっただけで、理論的には確実に速くなる代物なので、せっかく使ってみましたし使い方を書いておきます。
Dynamic Modifiers について
UE4.8 のリリースノートに、以下の文があります。
New: Navigation mesh has new option for runtime rebuilding - Dynamic Modifiers Only. It's the same as completely static navigation mesh but supports mesh modifications through NavMesh modifiers (dynamic obstacles). It has a little extra memory overhead compared to the completely static version. Supports streaming.
雑訳ですけど、「ほぼ static と同等だけど、NavMesh modifiers による差分だけサポートするよ」といった感じです。
「NavMesh modifiers」は Modes からボリュームとして配置できたり、コンポーネントとして追加できます。
ボリュームとして置いた場合、普通にサイズを設定して、その範囲だけに NavMesh の差分を適応できます。
どういった差分にするかどうかは、プロパティの「Area Class」で指定します。
4.10現在だと以下の内容を指定できます。
NavArea_Default | デフォルトのNavMeshの状態を維持します。(つまり何もしない) |
NavArea_LowHeight | これよくわかってません。情報求む。 |
NavArea_Null | 打ち消しです。通れなくなります。 |
NavArea_Obstacle | ここを通るためのコストが上昇します。(AIがこの道を選びにくくなります) |
つまりは途中で通れる道にしたい場合はNullからDefaultへ、途中で通れなくしたい場合はDefaultからNullへ変更すれば良さそうです。
試してみる
デフォルト設定だと NavigationMesh はゲーム中にビルドされません。
つまりは動的オブジェクトが出現したとしても反映されません。
右に見えるキューブは動的に発生させたものですが、しっかりナビゲーションの海(?)に浸かっていますね。
ここで設定を変更してみましょう。
Project Settingsからデフォルトのランタイムビルド設定は変更できます。
こちらの設定を Dynamic Modifires Only に変更します。
ただ、これだけでは結果は Static 設定の時と変わりません。
そこでキューブに対して NavModifierVolume をアタッチし、AreaClass を NavArea_Null にします。
この状態で実行すると、以下の様に動的オブジェクトを生成した場合にも通れないようになります。
これで低コストでナビゲーション情報のランタイム更新ができました。
たぶん…冒頭で書いたように計測してもほぼ同じだったんだけどさ…
もちろん Dynamic Modifires Only ではなく、Dynamic でももっと簡単に同様の結果を生み出せるので、どうしてもコストが気になったら使ってみるくらいがいいと思います。
現場からは以上です。