お世話になっております。
サンプルプロジェクトをご提供頂きありがとうございました。
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を動的に適用することが可能となります。
- PersistentLevelにNavmeshを配置
- RecastNavmeshのRuntimeGenerationをDynamicに設定
- [UE-66340][2]の修正CL#4981450を適用
よろしくお願いします。