This is very useful if you want to have custom per instance data, by default UE has a default instance data class which allows you to override the world origin of your sequence your are playing.
Warning
The TransformOrigin doesn’t handle scale.
Simple raw implementation:
// Most of the spawning and initializing parts are from the sequencer BP function library.
FActorSpawnParameters SpawnParams;
SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
SpawnParams.ObjectFlags |= RF_Transient;
SpawnParams.bAllowDuringConstructionScript = true;
// Defer construction for autoplay so that BeginPlay() is called
SpawnParams.bDeferConstruction = true;
LevelSequenceActor = GetWorld()->SpawnActor<ALevelSequenceActor>(SpawnParams);
FMovieSceneSequencePlaybackSettings PlaybackSettings;
PlaybackSettings.bAutoPlay = true;
PlaybackSettings.PlayRate = PlayRate;
LevelSequenceActor->PlaybackSettings = PlaybackSettings;
LevelSequenceActor->GetSequencePlayer()->SetPlaybackSettings(PlaybackSettings);
LevelSequenceActor->SetSequence(LevelSequence.LoadSynchronous());
LevelSequenceActor->bOverrideInstanceData = true;
auto* InstanceData = Cast<UDefaultLevelSequenceInstanceData>(LevelSequenceActor->DefaultInstanceData);
// there is also an actor version
InstanceData->TransformOrigin = GetInstanceTransform();
LevelSequenceActor->InitializePlayer();
FTransform DefaultTransform;
LevelSequenceActor->FinishSpawning(DefaultTransform);
LevelSequencePlayer = LevelSequenceActor->GetSequencePlayer();
LevelSequencePlayer->OnFinished.AddUniqueDynamic(this, &ThisClass::OnSequencerFinished);With bOverrideInstanceData true ALevelSequenceActor::GetInstanceData() (from the interface IMovieScenePlaybackClient) will return DefaultInstanceData.
The transform origin is used by FGatherTransformOrigin::Run, which uses IMovieSceneTransformOrigin with NativeGetTransformOrigin.