AActor::FActorTransactionAnnotation::FActorTransactionAnnotation(const AActor* Actor, const bool bCacheRootComponentData) : ComponentInstanceData(Actor) { USceneComponent* ActorRootComponent = Actor->GetRootComponent(); if (bCacheRootComponentData && ActorRootComponent && ActorRootComponent->IsCreatedByConstructionScript()) { bRootComponentDataCached = true; RootComponentData.Transform = ActorRootComponent->ComponentToWorld; RootComponentData.Transform.SetTranslation(ActorRootComponent->GetComponentLocation()); // take into account any custom location if (ActorRootComponent->GetAttachParent()) { RootComponentData.AttachedParentInfo.Actor = ActorRootComponent->GetAttachParent()->GetOwner(); RootComponentData.AttachedParentInfo.AttachParent = ActorRootComponent->GetAttachParent(); RootComponentData.AttachedParentInfo.AttachParentName = ActorRootComponent->GetAttachParent()->GetFName(); RootComponentData.AttachedParentInfo.SocketName = ActorRootComponent->GetAttachSocketName(); RootComponentData.AttachedParentInfo.RelativeTransform = ActorRootComponent->GetRelativeTransform(); } for (USceneComponent* AttachChild : ActorRootComponent->GetAttachChildren()) { AActor* ChildOwner = (AttachChild ? AttachChild->GetOwner() : NULL); if (ChildOwner && ChildOwner != Actor) { // Save info about actor to reattach FActorRootComponentReconstructionData::FAttachedActorInfo Info; Info.Actor = ChildOwner; Info.SocketName = AttachChild->GetAttachSocketName(); Info.RelativeTransform = AttachChild->GetRelativeTransform(); RootComponentData.AttachedToInfo.Add(Info); } } } else { bRootComponentDataCached = false; } }
FChildActorComponentInstanceData::FChildActorComponentInstanceData(const UChildActorComponent* Component) : FSceneComponentInstanceData(Component) , ChildActorName(Component->GetChildActorName()) , ComponentInstanceData(nullptr) { if (Component->GetChildActor()) { ComponentInstanceData = new FComponentInstanceDataCache(Component->GetChildActor()); // If it is empty dump it if (!ComponentInstanceData->HasInstanceData()) { delete ComponentInstanceData; ComponentInstanceData = nullptr; } USceneComponent* ChildRootComponent = Component->GetChildActor()->GetRootComponent(); if (ChildRootComponent) { for (USceneComponent* AttachedComponent : ChildRootComponent->GetAttachChildren()) { if (AttachedComponent) { AActor* AttachedActor = AttachedComponent->GetOwner(); if (AttachedActor != Component->GetChildActor()) { FAttachedActorInfo Info; Info.Actor = AttachedActor; Info.SocketName = AttachedComponent->GetAttachSocketName(); Info.RelativeTransform = AttachedComponent->GetRelativeTransform(); AttachedActors.Add(Info); } } } } } }