ナビメッシュが2重に生成されるケースの設定と運用法

1. ナビメッシュが2重に生成する問題

マップ全体にナビメッシュを適用しようとする場合、ナビメッシュボリュームでマップ全体を覆うような配置を行います。ナビメッシュボリュームで覆われたエリアは、コリジョンの有効なジオメトリ上にナビメッシュをどこにでも生成しようとします。このようなケースにおいて、例えば図のようなランドスケープにナビメッシュを適用しようとするケースでランドスケープの下にも巨大なナビメッシュが生成されます。例えば以下のようなマップに対してナビメッシュを生成するためにバウンスで覆った場合、

以下のようにランドスケープと、ランドスケープの外にあるスタティックメッシュにナビメッシュが生成されます。これは一般的な配置のケースですが、カメラを近づけてランドスケープの内部を除くと、ランドスケープの内部、スタティックメッシュとの接地面に対してもナビメッシュが生成されて、ナビメッシュが2重に敷かれることになります。
2024-11-25_19h13_40

この事象は次のような理由から理想的ではありません。

  • ランドスケープの下に生成されるナビメッシュは殆どのケースにおいて使用することがなく、これは本来利用されないにも関わらずナビメッシュのためのメモリ消費が無駄に増加します。
  • ランドスケープの下に存在する全てのジオメトリ上のトライアングルを計算する必要があるため、ナビメッシュの生成にかかる時間も長くなります。
  • ランドスケープの下に生成されたナビメッシュに対しても経路探索やAI制御のための処理が走るため、予期せぬAIの挙動になることが想定されます。

たとえば下の図のようなランドスケープにスタティックメッシュが刺さっているようなケースにおいても、スタティックメッシュの内部を除くとナビメッシュが生成されていることに気づきます。この現象はスタティックメッシュの上に作成することを目的としてバウンスで囲ったところ、このように意図せずに2重にナビメッシュが生成されることも想定されます。


2. ナビメッシュの2重生成に対する対処方法

これを解決するには、ナビメッシュの(スタティックメッシュやランドスケープの設定にある)bFillCollisionUnderneathフラグを使用します。これによりスタティックメッシュやランドスケープの下にあるもの、つまりコリジョンで埋められた領域内はすべてナビメッシュを生成しないようになります。

ナビメッシュの bFillCollisionUnderneathフラグは、ランドスケープ上に存在するだけでなく様々なアクター上にも存在し、特定のケースでナビメッシュの一部のポケットを削除するために使用できます。このフラグを適用する前に、ジオメトリの下にあるナビメッシュを確認し、フラグを有効にすることでナビメッシュが生成されないことを確認します。

3. コリジョンで埋めたエリア内にナビメッシュを生成する

ほとんどの場合、ランドスケープの下に Navmesh を配置する必要はありませんが、トンネル、基地、またはランドスケープの下にまだ存在する場所を作成したいような特殊なケースがあります。これに対処するには 2 つの方法があります。

  1. ナビメッシュのLandscapeComponent bFillCollisionUnderneathForNavmeshのフラグを削除する
  2. NavModifierVolumeでエリアを囲み、bMaskFillCollisionUnderneathForNavmeshにチェックを入れる

推奨される解決策は 2. です。ランドスケープの下にナビメッシュを配置するゲームプレイ領域をカプセル化する NavModifierVolume を追加します。そしてbMaskFillCollisionUnderneathForNavmeshを有効にすることで、NavModifierVolume で覆ったエリアの範囲内のみでナビメッシュの生成を有効にして適用することができます。この際、NavModifierVolume のプロパティでArea Class は Noneに設定します。

4 Likes