WorldComposition使用時のナビメッシュについて

お世話になっております。

World Composition を使用してる場合の Static なナビメッシュの使用ついて検証を行っております。

サブレベルのロードと同期して、ナビメッシュもロードしたいと想定し、添付プロジェクトを作成し検証を行いました。

しかし、結果としてどれも想定を満たす挙動にはなりませんでした。

World Composition で Static なナビメッシュを使用する場合のレベルの構成はどのようになるでしょうか?

(そもそも、こちらの想定が実現できないものであるのかもしれません)

■ 添付プロジェクトの内容

World Composition を使用した 3 種のレベルを作成し
下記のように NavMeshBoundsVolume を配置しております。

PatternA パーシスタントレベルのみに配置

PatternB サブレベルのみに配置

PatternC パーシスタント、サブレベル両方に配置

○ PatternA の場合

ロードされているサブレベルのみナビメッシュが生成されました。

実行時はロードされていないサブレベルのナビメッシュも保持されていました。

○ PatternB

ナビメッシュをビルドしても実行時には消失していました。

サブレベル単体で開き、ナビメッシュのビルドを行った場合、
実行時は最初に読み込まれたものが有効になり続け、後から読み込んだものは無効化される挙動になりました。

○ PatternC

PatternA と同じくナビメッシュが作成され、サブレベルと共にロードが行われました。
挙動としては最も想定に近いものになっておりました。

しかし、ロードされていない箇所に意図しないナビメッシュが存在していました。

また、サブレベルをロード・アンロードした場合にナビメッシュのビルドが実行され意図しない形状でナビメッシュが生成されていました。

お世話になっております。
サンプルプロジェクトをご提供頂きありがとうございました。

World Composition で Staticなナビメッシュを使用する場合のレベルの構成はどのようになるでしょうか?

Staticでも実現出来ないことは無いのですが、調整や配置がシビアなものになるためDynamicをご利用されることをお勧めします。その理由も踏まえて、頂いたサンプルでうまく動作しなかった点を以下に説明させて頂きます。

  • PatternA の場合
    これは「全てのNavMeshBoundsVolumeがPersistentLevelに配置されてナビメッシュのビルドを行われていること」によるもので、たとえSubLevelがアンロードされた場合においてもPersistentLevelにナビメッシュの情報が残り続けるためです。ナビメッシュビルドもライトビルドと同じようなものとイメージ頂くと分かりやすいかもしれませんが、ビルドされたレベルにナビメッシュが保持されていたのもその理由によるものです。SubLevelを一切ロードしていない状態でPersistentLevelでビルドを実施するとナビメッシュが全く生成されていないことが確認できるかと思います。

  • PatternB の場合
    これは「NavMeshBoundsVolumeがPersistentLevelに配置されていないこと」によるものです。これは現在の仕様の動作ですが、PersistentLevelには少なくとも1つのNavMeshBoundsVolumeが存在していないとナビメッシュを生成することができません。よって「SubLevelのみにNavMeshBoundsVolumeを配置して動作する」ということを実現されたい場合においても、少なくともPersistentLevelには1つのNavMeshBoundsVolume(正確には1つ以上のNavMeshBoundsVolumeとRecastNavMesh)を配置して頂く必要がございます。

  • PatternC の場合
    これは「中央に配置されたPersistentLevelのNavMeshBoundsVolumeと、アンロードするレベルに存在しているNavMeshBoundsVolumeの一部が同一Tile上に存在すること」によるものです。以下の図はRecastNavmeshのTileBoundsのデバッグ表示を有効にした状態です。
    Staticにおいては、このような別レベルに存在するNavMeshBoundsVolumeがアンロードして変更が発生した場合においても、残存のNavMeshBoundsVolumeの所属するTileは再更新を行うことが無いため、Tileが重複していた一部のナビメッシュが残り続けます。よってStaticで実施するにあたってはこのようなTileが重複しないことを考慮すれば実現可能かもしれませんが、調整や配置に十分に気を付ける必要があるためお勧めしません。

もしDynamicを利用されるとした場合は以下のことを実施頂くことで、SubLevelでNavmesh管理を実現しつつNavmeshを動的に適用することが可能となります。

  1. PersistentLevelにNavmeshを配置
  2. RecastNavmeshのRuntimeGenerationをDynamicに設定
  3. [UE-66340][2]の修正CL#4981450を適用

よろしくお願いします。

1 Like