お世話になっております。
PCGVolume を別レベルにコピー&ペーストした際に、コピー元のレベルで生成されたスタティックメッシュがコピー先にも残ります。
1. レベル(LV_TestPCG)に PCGVolume を配置し、PCGグラフを使ってスタティックメッシュを生成します。※ IsPartition は OFFの状態
[Image Removed]
2. 1.の PCGVolume をコピー し、新規レベル(LV_TestPCG2)に貼り付けます。(※StaticMeshSpawnerでマテリアルを変更しています)
[Image Removed]
3. コピー元レベル(LV_TestPCG)で生成されたスタティックメッシュと、コピー先(LV_TestPCG2)で生成されたスタティックメッシュの両方が生成された状態となります。
4. この状態では PCGComponent でクリーンアップや生成をおこなった場合、コピー元(LV_TestPCG)で生成されたスタティックメッシュは変化せず、コピー先(LV_TestPCG2)で生成されたスタティックメッシュのみが変化します。
とあるレベルで設定した PCGVolume を 別レベルにコピーして使用するという方法でレベルの量産を進めており、
この際にコピー元のレベルのスタティックメッシュがコピー先に残るのは避けたいと思っています。
レベルを跨いだ PCGVolume のコピー&ペーストを行う場合に、コピー元で生成されたスタティックメッシュがコピー先で生成されるのを回避する方法はあるでしょうか?
再現手順
- PCG/LV_TestPCG を開きます。
- アウトライナーから、PCGVolume をコピーします。
- 新規レベル(OpenWorld)を作成し、PCGVolume を貼り付けます
- 張り付けた PCGVolume の (X,Y)座標を(0,0)に変更します。
LV_TestPCG で生成されたスタティックメッシュ(金色)と新規レベルで生成されたスタティックメッシュ(白色)が共存した状態となります。
PCGVolume -> PCGComponent で 生成、クリーンアップすると、スタティックメッシュ(白)のみが変更され、スタティックメッシュ(金)は変更されません。
再現プロジェクトのご用意ありがとうございます。
UE-283330 Generated instances can not be cleaned up when PCGVolume is copied to a different level としてバグ登録させていただきました。
UE5.4にレベルを超えてコピーされたPCGVolume内のコンポーネントを消す方法はありません。
UE5.5であればCtrlキーを押したままCleanupボタンを押すことで強制パージ処理を行って削除することが可能です。
正式な修正がエンジンに適用されるまで、UE5.4では以下のいずれかのワークアラウンドを検討できます。
1.エディタユーティリティなどで、PCGHelpers::DefaultPCGTagをコンポーネントタグとして設定されているコンポーネントを削除する機能を実装する
2.クリーンナップ処理(UPCGComponent::CreateCleanupTask)にコードを加えて手動で削除できるようにする。以下は実装例です。
FPCGTaskId UPCGComponent::CreateCleanupTask(bool bRemoveComponents, const TArray<FPCGTaskId>& Dependencies) { ... if (!Resource || Resource->Release(bRemoveComponents, Context->ActorsToDelete)) { ... // Returning false means the task is not over return false; } else { #if 1 //ワークアラウンド TArray<UActorComponent*> ActorComponentList; ThisComponent->GetOwner()->ForEachComponent(/*bIncludeFromChildActors=*/true, [&ActorComponentList](UActorComponent* ActorComponent) { if (ActorComponent && ActorComponent->ComponentHasTag(PCGHelpers::DefaultPCGTag)) { ActorComponentList.Add(ActorComponent); } }); for (UActorComponent* ActorComponent : ActorComponentList) { ActorComponent->DestroyComponent(); } #endif //ワークアラウンド ThisComponent->GeneratedResourcesInaccessible = false; }
3. UE5.5の FPCGComponentDetails::OnCleanupClicked 中から呼び出されているCleanupLocalDeleteAllGeneratedObjectsをUE5.4に取り込んで利用する
4.テキストをコピーしてクリップボード経由で張り付けるような運用を行っている場合、InstancedStaticMeshComponentが記述されている部分を削除したテキストを用意しておく
お世話になっております。
ご確認ありがとうございます。
また、バグ登録ありがとうございます。
ご提示頂いた回避方法を検討・導入し、対処していきたいと思います。