【開発環境】
- Windows 11
- UE 5.7.4 ランチャー版
お世話になっております。
タイトルの通り、WPマップにて、IsSpatiallyLoadedをオフにしたアクタをマップに配置して、別のアクタの子にした状態ではじめてセーブすると、親子付けが勝手に外れてしまいます。しかし、マップをリロードすると、親子付けされた状態に戻っています。
IsSpatiallyLoadedがオンだと、この症状は起きません。また、親子付けする前にセーブしておいて親子付けしたあとで改めてセーブするときもこの症状は起きません。
自作のアクタ生成&配置ツールなどでこのようなオペレーションを自動化しているのですが、このように親子付けして配置したものが、セーブしたときに親子付けが外れてしまうので困っています。
親子付けする前に一旦セーブするようなフローにすれば回避できそうではあるのですが、他に何か対処法などございましたらご教示いただきたいです。
ご確認よろしくお願いします。
【再現手順】
1: 適当にWPマップを作成します。
[Image Removed]
2: 適当にBPアクタを作成します。IsSpatiallyLoadedをオフにします。
[Image Removed]
3: マップに適当に別アクタを配置します。これはBPアクタの親となる想定です。
[Image Removed]
4: 先ほど作成したBPアクタをマップに出し、親アクタの子にします。
[Image Removed]
5: BPアクタをセーブすると、
[Image Removed]
↓ 親子付けが外れてしまいます。
[Image Removed]
おまけ:マップをリロードすると、親子付けが直っています。
[Image Removed]
[Attachment Removed]
お世話になっております。
回答が遅くなり申し訳ありません。
また、非常に丁寧な再現手順のご説明をいただき、ありがとうございます!
確かにご指摘の通り、「IsSpatiallyLoaded = オン」のアクタに「IsSpatiallyLoaded = オフ」のアクタを親子付けすると、保存時に親子関係が解除された表示に切り替わるという不具合を確認いたしました。
こちらは、ヴァニラのUE5.7の段階では、すでに挙げられておられますように「親子付けの前にいったん保存する」しか回避方法がないようです。
一方、現在の//UE5/Main (UE5.8相当) では、CL47937000 CL48367807 を経て、この問題は修正されておりました。
Level.cpp (L1197) 付近において、
for (AActor* Actor : ActorsQueue)
{
// UnregisterAllComponents can destroy child actors
if (IsValid(Actor))
{
- Actor->DetachFromActor(FDetachmentTransformRules(EDetachmentRule::KeepWorld, /*bCallModify=*/false));
Actor->UnregisterAllComponents();
Actor->RegisterAllActorTickFunctions(false, true);
Actor->OnLoadedActorRemovedFromLevel();
(以下略)
のように、Actor->DetachFromActor()の呼び出しを削除していただければ、2つのCLをチェリーピックした結果と同等になります。
エンジンにパッチ適用可能な場合は、ぜひこちらの修正もお試しください。
以上、よろしくお願いいたします。
[Attachment Removed]
ご回答ありがとうございます!
UE5.7から入った不具合ということ、承知しました。
プロジェクトで使っているカスタムエンジンのほうでは、いただいたパッチコードを試して見たいと思います。
[Attachment Removed]
回答のご確認をありがとうございました!
それでは本件は回答済みとして一旦Closeとさせていただきます。
(※もしパッチが機能しないなどございましたら、その旨コメントいただくことで自動的に再Openいたします)
以上、よろしくお願いいたします。
[Attachment Removed]