중단점을 찍어서 확인해보니
KismetReinstanceUtilities.cpp ln.2109에서 아래와 같은 코드를 발견해서 의도된 사항인 것은 알겠으나,
왜 InstancedComponent를 원복하지 않는지, 그리고 원복할 수 있는 방법은 없는지에 대해서 궁금증이 생겨 문의드립니다.
static void ReplaceActorHelper(AActor* OldActor, UClass* OldClass, UObject*& NewUObject, UClass* NewClass, TMap<UObject*, UObject*>& OldToNewInstanceMap, const TMap<UClass*, UClass*>& InOldToNewClassMap, TMap<FSoftObjectPath, UObject*>& ReinstancedObjectsWeakReferenceMap, TMap<UObject*, FActorAttachmentData>& ActorAttachmentData, TArray<FActorReplacementHelper>& ReplacementActors, bool bPreserveRootComponent, bool& bSelectionChanged)
{
//////////// 중략 ///////////
OldActor->DestroyConstructedComponents(); // don't want to serialize components from the old actor
// Unregister native components so we don't copy any sub-components they generate for themselves (like UCameraComponent does)
/////////// 중략 /////////////
}
재현 방법
UE 5.2.2 버전을 커스텀해서 이용하는 중
다음과 같은 과정을 진행했을 때 레벨에 배치한 BP 액터 인스턴스에 추가한 InstancedComponent가 제거됩니다.
- 임의의 Actor BP 생성
- 해당 Actor BP를 레벨에 배치
- 2번에서 배치한 액터 인스턴스에 AddComponent 버튼을 눌러 임의의 컴포넌트(ex : StaticMeshComponent)를 추가.
- 1에서 생성한 BP를 열어서 BP 컴파일 버튼 클릭
- 3에서 추가한 컴포넌트의 저장 여부와 관계 없이 컴파일 후에 컴포넌트가 사라짐.
안녕하세요
말씀해주신 내용 확인 후 답변드리도록 하겠습니다.
감사합니다
안녕하세요.
5.2.1 / 5.6.1 버전에서 제공해주신 재현 방법을 검토 및 시도해보았으나, 동일한 현상은 재현되지 않았습니다.
또한 강조해주신 DestroyConstructedComponents() 함수의 경우, 블루프린트 에디터에서 추가된 ActorComponent나 C++ 생성자에서 CreateDefaultSubObject로 생성되어 RF_DefaultSubObject 플래그가 설정된 ActorComponent는 제거 대상에 포함되지만,
월드에 배치된 액터 인스턴스의 디테일 패널에서 Add 버튼을 통해 생성된 ActorComponent는 제거 대상에 포함되지 않는 것으로 확인됩니다.
혹시 말씀해주신 현상이 5.2.1 버전 또는 최신 언리얼 엔진에서도 재현 가능한지 확인해 주실 수 있을까요?
확인 후 결과를 공유해 주신다면 큰 도움이 될 것 같습니다.
바쁘신 와중에도 시간 내주셔서 감사드리며, 추가로 필요한 정보가 있으시면 언제든 말씀 부탁드립니다.
감사합니다.
확인해보니 AActor::DestroyConstructedComponents에서
저희가 커스텀하게 넣은 코드에 ConstructionScript인 경우 컴포넌트를 Destroy하도록 되어있어서 제거되고 있었네요.
답변해주셔서 감사합니다.