FLevelSequenceObjectReference::FLevelSequenceObjectReference(UObject* InObject, UObject* InContext) { if (InObject->IsA<AActor>() || InObject->IsA<UActorComponent>()) { if (InContext->IsA<AActor>()) { // When the context is an actor, we only use path name lookup within the actor since it's assumed the actor will be a spawnable // As such, a persistent identifier for a dynamically spawned actor is not tenable ObjectPath = InObject->GetPathName(InContext); ObjectId = FUniqueObjectGuid(); } else { ObjectId = FLazyObjectPtr(InObject).GetUniqueID(); ObjectPath = InObject->GetPathName(InContext); } } }
TSharedPtr<FMovieSceneAnimationSectionRecorder> UActorRecording::StartRecordingComponentProperties(const FName& BindingName, USceneComponent* SceneComponent, UObject* BindingContext, ULevelSequence* CurrentSequence, float CurrentSequenceTime, const FAnimationRecordingSettings& InAnimationSettings) { // first create a possessable for this component to be controlled by UMovieScene* OwnerMovieScene = CurrentSequence->GetMovieScene(); const FGuid PossessableGuid = OwnerMovieScene->AddPossessable(BindingName.ToString(), SceneComponent->GetClass()); // Set up parent/child guids for possessables within spawnables FMovieScenePossessable* ChildPossessable = OwnerMovieScene->FindPossessable(PossessableGuid); if (ensure(ChildPossessable)) { ChildPossessable->SetParent(Guid); } FMovieSceneSpawnable* ParentSpawnable = OwnerMovieScene->FindSpawnable(Guid); if (ParentSpawnable) { ParentSpawnable->AddChildPossessable(PossessableGuid); } // BindingName must be the component's path relative to its owner Actor FLevelSequenceObjectReference ObjectReference(FUniqueObjectGuid(), BindingName.ToString()); CurrentSequence->BindPossessableObject(PossessableGuid, ObjectReference); // First try built-in animation recorder... TSharedPtr<FMovieSceneAnimationSectionRecorder> AnimationRecorder = nullptr; if (FSequenceRecorder::Get().GetAnimationRecorderFactory().CanRecordObject(SceneComponent)) { AnimationRecorder = FSequenceRecorder::Get().GetAnimationRecorderFactory().CreateSectionRecorder(this, InAnimationSettings); AnimationRecorder->CreateSection(SceneComponent, OwnerMovieScene, PossessableGuid, CurrentSequenceTime); AnimationRecorder->Record(CurrentSequenceTime); SectionRecorders.Add(AnimationRecorder); } // ...and transform... if (FSequenceRecorder::Get().GetTransformRecorderFactory().CanRecordObject(SceneComponent)) { TSharedPtr<IMovieSceneSectionRecorder> Recorder = FSequenceRecorder::Get().GetTransformRecorderFactory().CreateSectionRecorder(true, nullptr); if (Recorder.IsValid()) { Recorder->CreateSection(SceneComponent, OwnerMovieScene, PossessableGuid, CurrentSequenceTime); Recorder->Record(CurrentSequenceTime); SectionRecorders.Add(Recorder); } } // ...now any external recorders TArray<IMovieSceneSectionRecorderFactory*> ModularFeatures = IModularFeatures::Get().GetModularFeatureImplementations<IMovieSceneSectionRecorderFactory>(MovieSceneSectionRecorderFactoryName); for (IMovieSceneSectionRecorderFactory* Factory : ModularFeatures) { if (Factory->CanRecordObject(SceneComponent)) { TSharedPtr<IMovieSceneSectionRecorder> Recorder = Factory->CreateSectionRecorder(ActorSettings); if (Recorder.IsValid()) { Recorder->CreateSection(SceneComponent, OwnerMovieScene, PossessableGuid, CurrentSequenceTime); Recorder->Record(CurrentSequenceTime); SectionRecorders.Add(Recorder); } } } return AnimationRecorder; }