Sequencer & cinematics
Sequencer is Unreal's non-linear timeline editor. A Level Sequence (ULevelSequence) binds
actors and animates their properties via tracks; you play it at runtime through a
ULevelSequencePlayer for cutscenes or scripted moments, and feed gameplay events back through
event tracks or the OnFinished delegate.
When to use this skill
- Triggering a cutscene or scripted in-game beat from C++ and reacting when it ends.
- Overriding which actors a sequence controls at runtime (dynamic/spawned characters).
- Animating a film-style camera (focal length, aperture, depth of field) via Cine Camera.
- Firing gameplay functions at exact timeline positions (event tracks / Director blueprint).
- Using Movie Render Queue for offline high-quality output from a sequence asset.
The pieces
| Type | Role |
|---|---|
ULevelSequence |
Cinematic asset — wraps UMovieScene (tracks, sections, bindings) |
ALevelSequenceActor |
Level-placed actor that holds the player and settings |
ULevelSequencePlayer |
Runtime player: play/stop/scrub/loop, delegates, binding overrides |
ULevelSequenceDirector |
Per-sequence Blueprint class that event tracks call into |
ACineCameraActor / UCineCameraComponent |
Film-style camera (filmback, focus, aperture) |
Modules to add to your .Build.cs:
"LevelSequence", "MovieScene", "CinematicCamera"
For Movie Render Queue also add "MovieRenderPipelineCore" (and enable the plugin).
Playing a sequence from C++
The factory method ULevelSequencePlayer::CreateLevelSequencePlayer spawns a transient
ALevelSequenceActor, initialises its player, and returns the player ready to use. The
out-param SeqActor receives the spawned actor (useful for lifecycle control).
#include "LevelSequence.h"
#include "LevelSequenceActor.h"
#include "LevelSequencePlayer.h"
#include "MovieSceneSequencePlayer.h"
// Called from BeginPlay or a gameplay event — never from a constructor.
void AMyDirector::PlayCutscene()
{
if (!CutsceneAsset) { return; } // UPROPERTY TObjectPtr<ULevelSequence> CutsceneAsset
FMovieSceneSequencePlaybackSettings Settings;
// Settings.bAutoPlay = false; // default; we call Play() explicitly
// Settings.LoopCount.Value = 0; // play once; -1 = infinite
ALevelSequenceActor* SeqActor = nullptr;
ULevelSequencePlayer* Player = ULevelSequencePlayer::CreateLevelSequencePlayer(
GetWorld(), CutsceneAsset, Settings, SeqActor);
if (Player)
{
Player->OnFinished.AddDynamic(this, &AMyDirector::OnCutsceneDone);
Player->Play();
}
}
UFUNCTION()
void AMyDirector::OnCutsceneDone()
{
// Re-enable player input, restore camera, advance game state.
}
If you placed an ALevelSequenceActor in the level, prefer:
// PlacedSeqActor is a UPROPERTY TObjectPtr<ALevelSequenceActor> set in the editor.
if (ULevelSequencePlayer* P = PlacedSeqActor->GetSequencePlayer())
{
P->OnFinished.AddDynamic(this, &AMyDirector::OnCutsceneDone);
P->Play();
}
Key player methods (all on UMovieSceneSequencePlayer, base of ULevelSequencePlayer):
| Method | Effect |
|---|---|
Play() |
Forward from current position |
PlayLooping(int32 NumLoops = -1) |
Loop: -1 = infinite, 0 = play once more |
Stop() |
Stop and move cursor to end (or start if reversed) |
Pause() |
Pause at current position |
SetPlaybackPosition(FMovieSceneSequencePlaybackParams) |
Jump or scrub to a time/frame |
SetPlayRate(float) |
Negative for reverse |
GetCurrentTime() |
Returns FQualifiedFrameTime |
Source: Runtime/MovieScene/Public/MovieSceneSequencePlayer.h — Play:193, PlayLooping:208,
Stop:220, Pause:212, SetPlaybackPosition:344, OnFinished:426.
Bindings — possessables vs spawnables
A possessable references a pre-existing level actor (linked by soft object path). A spawnable is an actor template embedded in the sequence that the player spawns/destroys for the duration of playback.
- Possessable: stable cross-level binding; breaks if the target actor is renamed, moved to another level, or replaced at runtime without rebinding.
- Spawnable: self-contained; the sequence owns the actor's lifetime, making the sequence portable and usable without placing anything in the level. Prefer spawnables for cinematic- only characters or props that don't need to interact with gameplay after the cutscene.
Runtime binding override
For dynamic actors (spawned at runtime, procedurally placed), override a binding on the
ALevelSequenceActor rather than editing the asset:
// Binding must be tagged in the Sequencer UI (RMB on binding > Tags…).
// FMovieSceneObjectBindingID can come from FindNamedBinding() or a designer-exposed
// UPROPERTY(EditAnywhere) FMovieSceneObjectBindingID.
PlacedSeqActor->SetBindingByTag(
FName("HeroCharacter"), // tag set in the Sequencer UI
{DynamicallySpawnedHero}, // TArray<AActor*>
/*bAllowBindingsFromAsset=*/false);
SetBinding / SetBindingByTag / AddBinding / ResetBindings are all on
ALevelSequenceActor (LevelSequenceActor.h:178–238). They write into the actor's
UMovieSceneBindingOverrides object without modifying the sequence asset.
Full binding and track internals: references/tracks-and-bindings.md.
Cameras & camera cuts
Add a Camera Cuts track to the sequence to drive which camera the viewer sees. During
playback the player overrides the viewport to the active cut camera; on finish the view returns
to the player camera (controllable via FLevelSequenceCameraSettings).
Use ACineCameraActor / UCineCameraComponent for cinematic look. Key properties (all
UPROPERTY(Interp, …), so they can be keyframed in Sequencer):
| Property | Type | Effect |
|---|---|---|
CurrentFocalLength |
float |
Zoom; derives FoV from filmback |
CurrentAperture |
float |
f-stop — controls depth of field |
Filmback |
FCameraFilmbackSettings |
Sensor size (width × height mm) |
FocusSettings |
FCameraFocusSettings |
Manual / tracking / disable DoF |
UCineCameraComponent inherits from UCameraComponent; ACineCameraActor wraps it and
adds LookatTrackingSettings. Source: Runtime/CinematicCamera/Public/CineCameraComponent.h
and CineCameraActor.h.
Camera and camera-cuts deep dive: references/cameras-and-cuts.md.
Event tracks (timeline → gameplay)
Event tracks fire at keyframe positions and invoke functions on the sequence's
ULevelSequenceDirector subclass (a Blueprint). The director receives bound-object references
through GetBoundObjects(FMovieSceneObjectBindingID) / GetBoundActor(…).
Use event tracks to spawn effects, toggle gameplay flags, or advance state at exact cinematic
beats — the timeline analog of anim notifies (see ue-animation-system). For gameplay → timeline
(driving a sequence from code), just call SetPlaybackPosition or PlayTo.
The Director's player pointer is UPROPERTY(BlueprintReadOnly) TObjectPtr<ULevelSequencePlayer> Player (LevelSequenceDirector.h:131).
Movie Render Queue
For offline renders (trailers, pre-rendered cutscenes), use the Movie Render Pipeline plugin rather than the editor's legacy "Render Movie" button. It supports multi-sample anti- aliasing accumulation, warmup frames, EXR / PNG / ProRes output, and render passes.
The queue is managed via editor subsystem (MoviePipelineQueueSubsystem) or Python/Blueprint
scripting; runtime rendering in a packaged build uses UMoviePipeline directly.
Plugin headers live in:
Engine/Plugins/MovieScene/MovieRenderPipeline/Source/MovieRenderPipelineCore/Public/
Full MRQ setup and scripting: references/movie-render-queue.md.
Gameplay vs cinematic control
- Disable player input with
APlayerController::SetInputMode/DisableInputduring non- interactive cutscenes; restore inOnFinished. - For interactive moments (player can still move), skip disabling input and use the sequence only for cameras or specific actors.
- Networked cinematics: trigger the sequence on every client via an RPC/replicated event.
ALevelSequenceActorhasbReplicatePlayback(LevelSequenceActor.h:117) but Sequencer playback itself is not automatically synchronised — coordinate timing explicitly. Seeue-networking-and-replication.
Gotchas
- Possessable binding breaks on rename/move — if the bound actor is renamed or moved to a
sublevel, the soft-object-path reference breaks. Use tags +
SetBindingByTagat runtime. - Forgetting to restore input/camera — always hook
OnFinishedand undo any cinematic-mode state (input, camera, HUD visibility) there. - Null player after
CreateLevelSequencePlayer— this returns null ifGetWorld()is null (CDO, editor context) orLevelSequenceis null. Guard both. - Replicated playback is not frame-accurate —
bReplicatePlaybackgives clients a status update, not a sample-accurate sync. For frame-locked sync, implement your own timing. - Event track functions must exist on the Director blueprint — functions called by event
tracks must be
BlueprintCallableand present in the Director class; mismatches are silent. - Forgetting module deps — missing
"LevelSequence"in.Build.cscauses include errors forULevelSequencePlayerandALevelSequenceActor. - Completion mode — by default Sequencer restores animated properties on stop. Set
EMovieSceneCompletionModeOverride::ForceKeepStateviaPlayer->SetCompletionModeOverrideif you want animated transforms to persist after the sequence ends.
Version notes
ALevelSequenceActor::SequencePlayeris deprecated in 5.4; always useGetSequencePlayer()(LevelSequenceActor.h:153).- The
FGuid FindBindingFromObject(UObject*, UObject*)overload is deprecated in 5.5; use theSharedPlaybackStatevariant. - For Control Rig-authored animation played inside Sequencer, see
ue-control-rig-and-ik. - For skeletal animation tracks and Anim Notifies, see
ue-animation-system.
References & source material
Engine source (UE 5.8, under Engine/Source/Runtime/):
LevelSequence/Public/LevelSequence.h—ULevelSequence,MovieScene,DirectorClass.LevelSequence/Public/LevelSequenceActor.h—ALevelSequenceActor,GetSequencePlayer:153,SetBinding:178,SetBindingByTag:190,FindNamedBinding:244,bReplicatePlayback:117.LevelSequence/Public/LevelSequencePlayer.h—ULevelSequencePlayer,CreateLevelSequencePlayer:106,OnCameraCut:110,GetActiveCameraComponent:114.LevelSequence/Public/LevelSequenceDirector.h—ULevelSequenceDirector,Player:131,GetBoundObjects:65,GetBoundActor:95.MovieScene/Public/MovieSceneSequencePlayer.h—Play:193,PlayLooping:208,Stop:220,Pause:212,SetPlaybackPosition:344,OnFinished:426,OnStop:418,OnPlay:410.MovieScene/Public/MovieSceneSequencePlaybackSettings.h—FMovieSceneSequencePlaybackSettings.MovieScene/Public/MovieScene.h—UMovieScene(tracks/sections/bindings model).CinematicCamera/Public/CineCameraComponent.h—UCineCameraComponent,CurrentFocalLength:66,CurrentAperture:70,Filmback:38,FocusSettings:52.CinematicCamera/Public/CineCameraActor.h—ACineCameraActor,GetCineCameraComponent:90.
Plugin source (UE 5.8):
Engine/Plugins/MovieScene/MovieRenderPipeline/Source/MovieRenderPipelineCore/Public/MoviePipelineQueue.h
Official docs (UE 5.8, verified):
- Cinematics and Sequencer — https://dev.epicgames.com/documentation/unreal-engine/cinematics-and-movie-making-in-unreal-engine
- Sequencer Overview — https://dev.epicgames.com/documentation/unreal-engine/unreal-engine-sequencer-movie-tool-overview
- Spawnables and Possessables — https://dev.epicgames.com/documentation/unreal-engine/spawn-temporary-actors-in-unreal-engine-cinematics
- Movie Render Pipeline — https://dev.epicgames.com/documentation/unreal-engine/movie-render-pipeline-in-unreal-engine
- Cameras in Sequencer — https://dev.epicgames.com/documentation/unreal-engine/movie-and-cinematic-cameras-in-unreal-engine
Deep-dive references in this skill:
- references/tracks-and-bindings.md — MovieScene data model (tracks, sections, channels), binding types, runtime binding override API.
- references/cameras-and-cuts.md — Cine Camera properties,
Camera Cuts track, camera blending,
OnCameraCutdelegate. - references/level-sequence-and-player.md — full player API, playback settings, completion modes, Director, event tracks.
- references/movie-render-queue.md — MRQ pipeline, scripting renders, runtime builds, render passes.