お世話になっております。
表題の通り、ActorがDestroyされるときにアタッチされているNiagaraComponentは完了を待ってから消したいと思っています。
NiagaraComponentをDeactivate()したあとにSpawnSystemFinishedのイベントかIsCompleted()がtrueになるのを待ってからActorをDestroyするのが公式の手順かと思いますが、
ActorはNiagaraComponentを待たずに即時Destroyしたいです。
以前別プロジェクトでCascadeを使用していた際は、DetachFromComponentを呼ぶだけで期待する動作が得られましたが、
NiagaraではDetachFromComponentだけではActorのDestroyと同時にエフェクトも消えてしまいます。
こちら挙動を調べたところ、AActor::EndPlayでアタッチされているNiagaraComponentのEndPlayが呼ばれてしまうことが関係あるように見えました。
なので、以下のようにNiagaraComponentを所有しているActorのEndPlay時にRemoveOwnedComponentを呼ぶことでActorは即時Destroyかつ、NiagaraComponentは完了を待ってから消すことができました。
しかしこの方法では、NiagaraCompのOwnerとなるActorがDestroyされたあともNiagaraComponentが動作してしまうことになり安全なのか?が気になっています。
NiagaraComp->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform); // AActor::EndPlayでEndPlayが呼ばれてしまうためOwnedComponentから外す RemoveOwnedComponent(NiagaraComp); NiagaraComp->SetAutoDestroy(true); NiagaraComp->Deactivate();
代案として、Renameを呼び出してOuterを変更することも試しましたが、以下の個所でEnsureを引いてしまいます。
FPrimitiveSceneInfoAdapter(UPrimitiveComponent* InComponent) { ... check(InComponent->SceneData.OwnerLastRenderTimePtr == FActorLastRenderTime::GetPtr(InComponent->GetOwner()));
こちらRemoveOwnedComponentを使用する方法に問題がないか?また他に良い解決法があればご教授いただければ幸いです。
よろしくお願いいたします。