はじめに
RE:2023 ナビゲーションAIシステム概要とタイトル活用事例 - YouTube
上記の講演ビデオ中にある「ナビメッシュを分割できるオブジェクトを事前に配置しておき、動的なオブジェクトに合わせて有効・無効を切り替えることで、ナビメッシュの動的分割の負荷を大幅に減らす」という内容にとても感心したのでUnreal Engineでも有効な内容であるか実験してみた。
実験内容
- Nav Modifierコンポーネントを追加したブループリントを毎フレーム回転させた場合
- 事前に配置したNav Modifier Volumeを回転物の角度に合わせてArea Classを切り替える場合
上の2つの方法でどれほど負荷(ナビメッシュのリビルドを実行した回数)があるかを計測してみる。
動的にNav Modifierを更新するので
Unreal Engine でナビゲーション メッシュを修正する方法の概要 | Unreal Engine 5.3 ドキュメント
上記の「ランタイム生成 (Dynamic Modifiers Only) を使用」の項目を参考にナビメッシュのランタイム生成を有効にしておく。
計測方法
[UE5] UnrealInsights を使ってみよう|株式会社ヒストリア
上記のページを参考にUnreal Insightsを用いてプロファイリングを実行する。ゲームが起動してからフレームの変動が落ち着いたあたりから10秒間を取り出し「Recast: build navmesh」のカウント数をそのまま負荷の指標とした(厳密な測定方法がわからないので、こういう方法を取ってみた)。
結果
画像右側にある「Timersタブ」にある「Recast: build navmesh」のカウント数に注目。
- Nav Modifierコンポーネントを追加したブループリントを毎フレーム回転させた場合の結果
- 事前に配置したNav Modifier Volumeを回転物の角度に合わせてArea Classを切り替える場合の結果
気づいたこと その1
この実験中「毎フレームナビメッシュを生成させたとき、経路探索が実行できない」ことに気づいた。
もしもアスレチック要素のあるゲームで常に移動・回転し続けるオブジェクトがあり、更にNPCに追いかけっこさせたい場合、事前にNav Modifier VolumeないしはNav Modifierコンポーネントを追加したアクターを配置してArea Classを切り替える方法がおすすめ。
上のような実装が難しい場合は動くオブジェクトを完全に停止する時間を作ってあげて、ナビメッシュのビルドが完了するのを待つ方法もある。ただし見た目やゲームプレイに大きく影響するので、その点は注意すること。
ランタイム時にナビメッシュのビルドが走るタイミング
- Nav Modifierコンポーネントの場合
・Set Area Class関数を呼び出した時。 ・ルートコンポーネントのトランスフォーム(座標、回転、スケール)が更新された時。
- Nav Mesh Bounds Volumeの場合
・Set Area Class関数を呼び出した時。
Nav Mesh Bounds VolumeはMobility(可動性)を「Movable」にしてランタイム時に動かしても、ナビメッシュのビルドは走らないので注意すること。