[WorldPartition]レベルインスタンス内に配置したナビゲーションデータの扱いに関して

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

現在、複数のチームが開発したそれぞれのレベルを1つのワールドパーティションレベルに配置し、1つのレベルに統合する検証を行っております。

その経過で、ナビメッシュに関する問題が発生したので確認したく存じます。​

〇手順​​1​

パーティション化したレベル(※)を2つ用意し、それぞれのレベル内にNavMeshBoundsVolume、Nav​ModifierVolume及び、床用のメッシュを配置して保存。

(※)ワールドパーティションは有効、ストリーミングは無効

〇手順​​2​

​それらをレベルインスタンスとして、他の親用のレベル(※)に1つずつ配置。

(※)ワールドパーティション、ストリーミングともに有効

〇手順3

​ナビメッシュをビルドする( Static )

​〇結果

プレイするとビルドされたナビメッシュが存在しない

また、親用のレベルを開くたびに​RecastNavMeshアクターに変更が入る

上記手順で作成した​再現プロジェクトを添付いたします。

こちらの問題につきまして、原因・解決方法等、ご教示いただけますと幸いです。

よろしくお願いいたします。​

SubLevel_2.png(2.37 MB)
MainLevel.png(2.22 MB)
SubLevel_1.png(2.53 MB)

再現手順
再現プロジェクトを開き、L_MainMapを開く。

ナビメッシュをビルドし、ゲームを起動する( PIE、スタンドアローン、パッケージ問わず )

ナビメッシュを可視化する。( "show navigation"コマンドを実行 )

ご連絡が遅くなりまして申し訳ございません。

サンプルプロジェクトを共有頂きありがとうございます。LevelInstance内で包括されたナビメッシュの生成については現在UE5.7においてサポートされておりません。そのため本ケースにおいては、RecastNavmeshをRuntimeGeneration設定をDynamicに設定して頂くか、Staticの設定を利用する場合はパーシスタントレベル側で領域を覆うようなNavmeshBoundsVolumeを配置し、n.bNavmeshAllowPartitionedBuildingFromEditor 1でビルドを行って頂くか、のどちらかの方法となります。

ご確認頂き、再現プロジェクトも添付頂きありがとうございます。問題の解決に至らず申し訳ございません。現在本挙動について開発チームと解決策について議論しておりますので、今暫くお待ちいただけますと幸いです。

本件、お知らせ頂きありがとうございます。

少々社内の確認に時間を要しており申し訳ございません。引き続き調査・確認を行っておりますので今暫くお待ちいただけますと幸いです。

お時間を頂きありがとうございます。

本件は幾つかの問題が発生していることによって複雑な動作になっているものと思われます。

まず一番最初に問題として提起いただいた以下の件につきまして、

> プレイするとビルドされたナビメッシュが存在しない

PIE からロードされたレベルでナビメッシュが正しくロードされない問題(https://issues.unrealengine.com/issue/UE\-306980:非公開)によるものと思われます。これは UE5.8(CL#52067159)で修正が適用される予定です。

> 親用のレベルを開くたびにRecastNavMeshアクターに変更が入る

OFPA 環境で RecastNavMesh が毎回 dirty になる問題(https://issues.unrealengine.com/issue/UE\-229996)によるものと思われます。こちらもUE5\.8([CL\#49964307](https://github.com/EpicGames/UnrealEngine/commit/06effb58ec303f0670c29f9acbdc80be50219712))で

修正が適用される予定です。

> パッケージではそれらの変更が反映されない症状が確認出来ました。

WP Level Instance の部分ロードによりナビビルド時にアクターがロードされずナビメッシュが生成されない問題(https://issues.unrealengine.com/issue/UE\-314556)

によるものと思われます。こちらは現在修正がまだ行われておらず、現在LevelInstanceでの動作が安定しない一因の一つとなっています。

これらのことからUE5.6 におきましては幾つかの問題が存在しており、安定的な方法としては NavMeshBoundsVolume、NavModifierVolume をPersistent レベルに移す構成をご利用頂くことになります。

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

本件を更にデバッグして調査をしてまいりましたが、サンプルの内容で言えば L_MainMap.umap に RecastNavmesh が10個登録されている状態となっておりナビメッシュが作られないことが分かりました。これに関してはどの過程でそのようになったのか操作は分かりませんが、ナビメッシュビルドの時点で "NavData RegistrationFailed_AgentAlreadySupported, specified agent type already has its navmesh implemented."の警告が出力されていました。 LevelInstanceの構成に関しては問題がない(LevelInstance内にNavmeshBounds, および NavModifierが配置されていること)のですが、 LevelInstance 内に RecastNavmesh が存在している必要はないので、以下の設定を Engine,ini に追加して RecastNavmesh が生成されないようにしておく必要があります。

[/Script/NavigationSystem.NavigationSystemV1]
bAutoCreateNavigationData=false

本件については、再度マップを新規作成し、LI_Lighting、LI_SubMap_1、LI_SubMap_2 を配置して、ナビメッシュをビルドしなおすことで本問題が解消されてパッケージビルドにおいてもナビメッシュが想定通りに生成・表示されることを UE5.6, 5.7 において確認しております。お手数ですが上記を元にナビメッシュを再構築して頂けますと幸いです。なお本件のような状況にあるかどうかは、UNavigationSystemV1::RegisterNavigationDataInstances() で for (TActorIterator<ANavigationData> It(World); It; ++It) の It のデータをウオッチした際の NavData を確認した場合にNavDataが複数登録されているかが分かります。

動画の内容においては、World Settings の Auto Spawn Missing Nav Dataにチェックが入っていないかご確認ください。もしチェックが入っている場合はチェックを外した後に再度Volumeを配置してみてください。もしそれでもRecast Nav Meshが生成されているようであれば、Recast Nav Mesh のコンストラクタにブレークポイントを張って、明示的に生成される瞬間を追ってみると良いかと思います。

お時間を頂き申し訳ございません。

追加のサンプルの内容について調査を行っておりますので今暫くお待ちいただけますと幸いです。

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

ご連絡が遅くなりまして申し訳ございません。サンプルを元に確認を行っておりましたが、この構成において複数の問題が混在している可能性があり、原因の特定に時間が掛かっている状況です。長い間お時間を頂き恐れ入ります。継続して問題を調査しておりますが、現行の回避策はLI内にNavmeshを配置せずPersistentLevelに配置することですが、この構成においてはどこまでサポートされているかも含めて確認を行っております。

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

ご連絡が大変遅くなってしまい申し訳ございませんでした。PersistentにNavVolumeを配置せずLI内にのみNavVolume配置する運用は完全にサポートされていなかったというのが根本的な原因でしたが、こちらのパッチでPIEおよびパッケージビルドでナビメッシュが維持できることを確認できましたのでご参考になれば幸いです。現在NavmeshのWP対応をProductionReadyに移行する作業は積極的に行われていないため、このような問題がまだ発生するようでしたら可能な範囲でサポートできればと思いますのでお知らせ頂けますと幸いです。

WP_Navigation_Patch_UE57.zip(146 KB)

ご確認頂きありがとうございます。

>1.UE5.8への適用について

UE5.8に対しては大きな変更はないため、ファイルの上書きで差し替えはできませんが、手動でマージすることはUE5.7の時とそれほど作業量は変わりません。

>2.レベルインスタンス関連のサポート方針について

当該修正は機能リクエストとして追加したいと思います。

> RecastNavMeshおよびNavMeshBoundsVolumeのIsMainWorldOnlyへの対応

こちらについてはどのような利用ケースを想定されたものでしょうか?現状は対応していないというのは承知しておりますが、具体的な利用ケースによっては、こちらの要望に対する優先度が変わってくるものと推測しております。

ご説明頂きありがとうございます。本件は以下の番号でデータベースに登録させて頂きました。

お手数ですが、本ワークフローをご利用の際には問題が修正されるまでは、パッチを充てて頂きご対応頂けますと幸いです。

https://issues.unrealengine.com/issue/UE\-386399

ご返答いただきありがとうございます。

>LevelInstance内で包括されたナビメッシュの生成については現在UE5.7においてサポートされておりません

その旨、承知いたしました。こちらは将来的に対応される予定はありますでしょうか。

また、ご提案にありますもう一点の​ワールド パーティション化ナビゲーション メッシュにつきまして、ドキュメントを拝見する限り、UE5.7でもExperimentalの扱いになっているのですが、こちらは製品開発に使用しても問題はありませんでしょうか。

>RecastNavmeshをRuntimeGeneration設定をDynamicに設定して頂くか、Staticの設定を利用する場合はパーシスタントレベル側で領域を覆うようなNavmeshBoundsVolumeを配置し、n.bNavmeshAllowPartitionedBuildingFromEditor 1でビルドを行って頂くか

最初に添付いたしました再現プロジェクトを元に、複数のNavModifierVolumeとメッシュのみのレベルを用意し、それらをレベルインスタンスとしてパーシスタントレベルに複数配置しました。さらにそれらを包括するようにパーシスタントレベルに1つNavMeshBoundsVolumeを配置しました。

こちらでRuntimeGenerationをDynamicにしたケースと、Staticでn.bNavmeshAllowPartitionedBuildingFromEditor 1でワールドパーティション化ナビメッシュにしたケースの両方の検証を行ってみたのですが、エディタ上では正常に動作するものの、パッケージではそれらの変更が反映されない症状が確認出来ました。

実際に確認に使用したプロジェクトを改めて添付いたします。

重ねてのお願いとなり、恐縮ですがご教示いただけますと幸いです。

よろしくお願いいたします。

WorldParitionTest_00_Pak_2.zip(176 KB)

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

返信で問い合わせた件でございますが、進捗状況はいかがでしょうか。

内容を確認する旨のメールを御社からいただきましたので、確認のため、ご連絡させていただきました。

お忙しいところ恐縮ではございますが、ご教示いただければ幸いです。

よろしくお願いいたします。

ご返答いただき、ありがとうございます。

ナビメッシュに関してエンジン側に複数の不具合があり、それらに起因して本事象が発生している旨、承知いたしました。

>安定的な方法としては、NavMeshBoundsVolume、NavModifierVolume を Persistent レベルに移す構成をご利用頂くことになります。

こちらの方法につきましては、弊社環境では採用が難しい状況です。

UE-314556 の内容を確認したところ、NavModifierVolume に限らず、ナビメッシュに影響を与えるアクターをレベルインスタンスに含めるだけで、不安定な挙動が発生する可能性があるように受け取っておりますが、この認識で相違ございませんでしょうか。

また、こちらの問題はLevelBehaviorがStandaloneのレベルインスタンスが対象であるように受け取れるのですが、今回の再現プロジェクトではStandaloneのレベルインスタンスは使用しておりません。こちらについてもご意見をいただけますと幸いです。

現在、当方では UE5.7.4 を使用しております。

つきましては、当該バージョン環境において実施可能な各不具合のワークアラウンドがございましたら、ご教示いただけますと幸いです。

お手数をおかけいたしますが、何卒よろしくお願いいたします。

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

以下、3点ご確認させていただけますと幸いです。

>サンプルの内容で言えば L_MainMap.umap に RecastNavmesh が10個登録されている状態となっておりナビメッシュが作られないことが分かりました。これに関してはどの過程でそのようになったのか操作は分かりませんが

恐れ入りますが、1か月以上前の作業のため、正確な記憶ではない点ご容赦ください。

おそらく、LI_SubMap_1、LI_SubMap_2 の各レベル内に一度 NavMeshBoundsVolume を配置して保存し、その後、NavMeshBoundsVolume および自動生成された RecastNavMesh アクターをアウトライナー上で削除したものと思われます。

また、LI_SubMap_1、LI_SubMap_2 について、

bAutoCreateNavigationData=false

こちらの設定を事前に適用した状態で当該レベルを直接開き、NavMeshBoundsVolume を配置した時点で、RecastNavMesh アクターも同時に生成されてしまいます。

この状態で RecastNavMesh をアウトライナー上から削除した後にレベルを開き直すと、再度 RecastNavMesh アクターが生成されており、以降は削除できない状態となってしまいます。

本事象は、どのような原因によって発生しているのでしょうか。

UE-314556 に関して、こちらは今回の一連の不具合に関連する事象なのでしょうか。

>再度マップを新規作成し、LI_Lighting、LI_SubMap_1、LI_SubMap_2 を配置して、ナビメッシュをビルドしなおすことで本問題が解消されてパッケージビルドにおいてもナビメッシュが想定通りに生成・表示されることを UE5.6, 5.7 において確認しております。お手数ですが上記を元にナビメッシュを再構築して頂けますと幸いです

こちらにつきまして、再現サンプル程度の規模であれば対応可能ですが、規模の大きいプロジェクトにおいて同様の対応を行うことは非常に困難です。

また、LI_SubMap_1、LI_SubMap_2 などを個別に開いた状態でナビメッシュの確認を行いたい場合は、どのように対応すればよろしいでしょうか。

お手数をおかけいたしますが、上記3点についてご教示いただけますと幸いです。

よろしくお願いいたします。

①② 更に調べたところ、本件は UE-314556ではなく UE-229996 (SupportedAgent の設定を変更した後、外部アクター (OFPA) を有効にしてマップを保存しても、古い Recast ナビメッシュアクターが削除されない)の問題である可能性が極めて高いことが分かりました。これは CL#49964307 で修正されており UE5.8 で反映の予定です。

また、RecastNavMeshが作成されてしまうのは bAutoCreateNavigationData=false 以外に、プロジェクト設定の Auto Create Navigation Data = true と、エディタ設定の Update Navigation Automatically = true となっている可能性があり、これをオフにすることで自動生成されなくなるはずです。

③ 古いNavData の削除方法については、他に[**Deleting obsolete Navmesh actors from World Partition [Content removed] で定義されている方法や、 for (TActorIterator<ANavigationData> It(World); It; ++It) における It のデータからアセットパスを表示する方法、もしくはReference Viewer から External Actor のアセットパスを表示して、当該 RecastNavMesh のアセットを直接見つけてブラウザから削除する方法になります。

LI単位でのRecastNavmeshを維持しつつ PL側でもナビメッシュをビルドして PLにもRecastNavmeshが存在するケースは現状サポートされていない操作であるため、LI単体で確認する際には 上記設定によってNavDataの生成を有効にして確認し PLでナビメッシュビルドを行う前にLI側のRecastNavmeshを削除するか、LI側でNavDataを生成しないようにしてPLに配置された状態で確認して頂く方法が、現在の想定されるワークフローとなります。

>RecastNavMeshが作成されてしまうのは bAutoCreateNavigationData=false 以外に、プロジェクト設定の Auto Create Navigation Data = true と、エディタ設定の Update Navigation Automatically = true となっている可能性があり、これをオフにすることで自動生成されなくなるはずです

>古いNavData の削除方法については、他に[**Deleting obsolete Navmesh actors from World Partition [Content removed] for (TActorIterator<ANavigationData> It(World); It; ++It) における It のデータからアセットパスを表示する方法、もしくはReference Viewer から External Actor のアセットパスを表示して、当該 RecastNavMesh のアセットを直接見つけてブラウザから削除する方法になります

ご提示いただきました方法でLI_SubMap_1, LI_SubMap_2に古いNavDataが確認出来たので当該ファイルを削除しました。

そのうえでナビメッシュの自動生成を無効にする設定を行った状態で、LI_SubMapに対してNavMeshBoundsVolumeを配置してみましたが、変わらずRecastNavMeshアクターが生成される状態となっていました。

こちらにつきまして、手順方法に不足や間違いがあればご指摘いただけますと幸いです。

よろしくお願いいたします。

Trim_NavMesh.mp4(25.3 MB)

>World Settings の Auto Spawn Missing Nav Dataにチェックが入っていないかご確認ください

こちらの設定が有効になっていのが原因だったようで、チェックを外した後にLI_SubMap_1. LI_SubMap_2にて、RecastNavMeshが生成されないことが確認出来ました。

>LevelInstanceの構成に関しては問題がない(LevelInstance内にNavmeshBounds, および NavModifierが配置されていること)のですが、 LevelInstance 内に RecastNavmesh が存在している必要はないので、以下の設定を Engine,ini に追加して RecastNavmesh が生成されないようにしておく必要があります

こちら、プロジェクト設定・エディタ設定・ワールドセッティングにて自動生成を無効にしたうえでLevelInstance内にNavmeshBounds, およびNavModifierVolumeを配置しパーシスタントレベルでナビメッシュをビルドするようにしてみましたが、プレイ時にナビメッシュのデータが確認できませんでした。

ビルド後にアウトライナー上でRecastNavMeshは確認できるのですが、レベルを開きなおすとアウトライナー上で確認できません。

参照ビューワではRecastNavMeshの存在が確認でき、UNavigationSystemV1::RegisterNavigationDataInstances()でのfor (TActorIterator<ANavigationData> It(World); It; ++It)を確認したところ、エディタ上でレベルを読み込む際はRecastNavMeshの登録はされているようです。ですが、PIE実行時にはRecastNavMeshの登録が行われません。

実際に再現できるプロジェクトを添付いたします。

添付プロジェクトにて、L_MainMapを開きナビメッシュをビルドすることで再現できます。

今回の場合、複数のRecastNavMeshが登録されるということもなく、1つもRecastNavMeshが登録されない症状が出ています。

こちらの問題の原因と解決方法をご教示いただけますと幸いです。

よろしくお願いいたします。