Ue Specifiers
fjz13/UnrealSpecifiers
A skill your agent uses when writing, editing, reviewing, validating, or explaining Unreal Engine C++ reflected declarations: UCLASS, USTRUCT, UENUM, UINTERFACE, UPROPERTY, UFUNCTION, UPARAM, UMETA…
A skill your agent uses when playing Level Sequences from C++, building cutscenes or in-game camera moments, binding actors to sequence tracks at runtime, wiring Sequencer event tracks, or rendering…
$ npx skills add quodsoler/unreal-engine-skills --skill ue-sequencer-cinematics -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install quodsoler/unreal-engine-skills ue-sequencer-cinematics --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/quodsoler/unreal-engine-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/ue-sequencer-cinematics .claude/skills/ue-sequencer-cinematics && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "ue-sequencer-cinematics" agent skill from https://github.com/quodsoler/unreal-engine-skills/tree/main/skills/ue-sequencer-cinematics into .claude/skills/ue-sequencer-cinematics/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ue-sequencer-cinematics", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/quodsoler/unreal-engine-skills/tree/main/skills/ue-sequencer-cinematicsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add quodsoler/unreal-engine-skills --skill ue-sequencer-cinematics -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install quodsoler/unreal-engine-skills ue-sequencer-cinematics --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/quodsoler/unreal-engine-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/ue-sequencer-cinematics .agents/skills/ue-sequencer-cinematics && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ue-sequencer-cinematics" agent skill from https://github.com/quodsoler/unreal-engine-skills/tree/main/skills/ue-sequencer-cinematics into .agents/skills/ue-sequencer-cinematics/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ue-sequencer-cinematics", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add quodsoler/unreal-engine-skills --skill ue-sequencer-cinematics -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install quodsoler/unreal-engine-skills ue-sequencer-cinematics --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/quodsoler/unreal-engine-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/ue-sequencer-cinematics .cursor/skills/ue-sequencer-cinematics && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ue-sequencer-cinematics" agent skill from https://github.com/quodsoler/unreal-engine-skills/tree/main/skills/ue-sequencer-cinematics into .cursor/skills/ue-sequencer-cinematics/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ue-sequencer-cinematics", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/quodsoler/unreal-engine-skills.git --path skills/ue-sequencer-cinematics--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add quodsoler/unreal-engine-skills --skill ue-sequencer-cinematics -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install quodsoler/unreal-engine-skills ue-sequencer-cinematics --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/quodsoler/unreal-engine-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/ue-sequencer-cinematics .gemini/skills/ue-sequencer-cinematics && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ue-sequencer-cinematics" agent skill from https://github.com/quodsoler/unreal-engine-skills/tree/main/skills/ue-sequencer-cinematics into .gemini/skills/ue-sequencer-cinematics/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ue-sequencer-cinematics", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install quodsoler/unreal-engine-skills ue-sequencer-cinematicsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add quodsoler/unreal-engine-skills --skill ue-sequencer-cinematics -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/quodsoler/unreal-engine-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/ue-sequencer-cinematics .github/skills/ue-sequencer-cinematics && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ue-sequencer-cinematics" agent skill from https://github.com/quodsoler/unreal-engine-skills/tree/main/skills/ue-sequencer-cinematics into .github/skills/ue-sequencer-cinematics/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ue-sequencer-cinematics", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add quodsoler/unreal-engine-skills --skill ue-sequencer-cinematics -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install quodsoler/unreal-engine-skills ue-sequencer-cinematics --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/quodsoler/unreal-engine-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/ue-sequencer-cinematics .opencode/skills/ue-sequencer-cinematics && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ue-sequencer-cinematics" agent skill from https://github.com/quodsoler/unreal-engine-skills/tree/main/skills/ue-sequencer-cinematics into .opencode/skills/ue-sequencer-cinematics/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ue-sequencer-cinematics", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ue-sequencer-cinematicsA skill your agent uses when playing Level Sequences from C++, building cutscenes or in-game camera moments, binding actors to sequence tracks at runtime, wiring Sequencer event tracks, or rendering…
Ue Sequencer Cinematics is an agent skill from quodsoler/unreal-engine-skills. Use when playing Level Sequences from C++, building cutscenes or in-game camera moments, binding actors to sequence tracks at runtime, wiring Sequencer event tracks, or rendering with Movie Render Graph. Also use when the user mentions 'Sequencer', 'LevelSequence', 'ALevelSequenceActor', 'ULevelSequencePlayer', 'CreateLevelSequencePlayer', 'cutscene', 'camera cut', 'event track', 'ULevelSequenceDirector', 'SetBindingByTag', 'spawnable', 'possessable', 'CineCamera', 'Movie Render Queue', or 'MRQ'. For animation…
Its SKILL.md is about 7.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/sequencer-patterns.md`).
It sits in Game Development. It works with C++. The repository describes itself as: Unreal Engine C++ skills for AI coding agents. 27 skills covering gameplay, rendering, networking, animation, and more. Works with Claude Code, Cursor, Windsurf, and any agent… The licence is MIT.
Read from SKILL.md and the folder at commit f3742d7. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are cpp and csharp).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ue Sequencer Cinematics loads about 7.3k tokens when it runs, and up to ~16k if it reads all its reference files. Until then it costs about 168 tokens; SKILL.md has 1,728 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from quodsoler/unreal-engine-skills at commit f3742d7, republished under its MIT licence (© quodsoler). 1,728 words, ~7,326 tokens.
.claude/skills/ue-sequencer-cinematics/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Target engine: UE 5.8. APIs below are verified against the 5.8 headers; older forms are listed under "Deprecated — do not use".
Sequencer spans three runtime modules plus a plugin. MovieScene holds the data model and the player base class, MovieSceneTracks holds the concrete track and section types, LevelSequence holds the asset, actor, player and director, and CinematicCamera holds the cine camera and camera rigs. Offline rendering lives in the Movie Render Queue plugin (MovieRenderPipelineCore for runtime, MovieRenderPipelineEditor for the editor queue UI); it is disabled by default and must be enabled in the .uproject.
Read .agents/ue-project-context.md if it exists (module names, conventions, enabled plugins, GAS/networking setup). Do not stop if it is missing.
Identify the area from the request and the codebase. Ask only when two plausible readings would produce different code.
| Request is about… | Go to |
|---|---|
| Which modules to add to Build.cs | Build.cs Modules |
| What C++ can do at runtime vs editor-only | Runtime vs Editor |
| Starting, stopping, seeking, looping a sequence | Playing a Level Sequence |
| Pointing sequence tracks at gameplay actors | Binding Actors at Runtime |
| Calling C++ from a key on the timeline | Sequencer Event Tracks |
| Tracks, sections, sub-sequences, frame math | MovieScene Data Model |
| Cine camera setup, focus, rails and cranes | Cine Cameras and Camera Rigs |
| Rendering frames or video to disk | Movie Render Graph |
| Full worked cutscene, multiplayer and rig examples | Sequencer runtime patterns |
PublicDependencyModuleNames.AddRange(new string[]
{
"LevelSequence", // ULevelSequence, ALevelSequenceActor, ULevelSequencePlayer, ULevelSequenceDirector
"MovieScene", // UMovieScene, UMovieSceneSequencePlayer, FMovieSceneObjectBindingID
"MovieSceneTracks", // UMovieSceneEventTrack, UMovieSceneCameraCutTrack, property tracks
"CinematicCamera", // ACineCameraActor, UCineCameraComponent, ACameraRig_Rail, ACameraRig_Crane
});
// Offline rendering only. Requires the MovieRenderPipeline plugin enabled in the .uproject.
PrivateDependencyModuleNames.Add("MovieRenderPipelineCore");Authoring a sequence is an editor operation. Shipping game code plays and re-binds sequences; it does not build them.
| Task | API | Availability |
|---|---|---|
| Play, stop, seek, set play rate | UMovieSceneSequencePlayer | Runtime |
| Override which actors a binding resolves to | ALevelSequenceActor::SetBinding* | Runtime |
| Read tracks, bindings, frame rates | UMovieScene getters, UMovieSceneSequence::GetMovieScene | Runtime |
| Call C++ from the timeline | ULevelSequenceDirector subclass | Runtime |
| Queue and run a render | UMoviePipelineQueueEngineSubsystem (UEngineSubsystem) | Runtime |
| Add actors, cameras, spawnables to a sequence | ULevelSequenceEditorSubsystem (UEditorSubsystem) | Editor only |
| Scripted track/section creation and keying | UMovieSceneSequenceExtensions (Runtime module of the Beta SequencerScripting plugin) | Editor scripting — mutates assets |
| Register a custom track editor | ISequencerModule::RegisterTrackEditor | Editor only |
| Drive the Movie Render Queue window | UMoviePipelineQueueSubsystem (UEditorSubsystem) | Editor only |
UMovieScene::AddTrack and UMovieSceneSubTrack::AddSequence do compile into runtime builds, but they mutate the sequence asset. Call them only from editor tooling or commandlets — a cooked ULevelSequence must not be edited in a shipped game.
#include "LevelSequenceActor.h"
// LevelSequenceActor.h:153 — UFUNCTION(BlueprintGetter) ULevelSequencePlayer* GetSequencePlayer() const;
if (ULevelSequencePlayer* Player = SeqActor->GetSequencePlayer())
{
Player->Play();
}Useful ALevelSequenceActor members: PlaybackSettings, LevelSequenceAsset, BindingOverrides, DefaultInstanceData, bOverrideInstanceData, bReplicatePlayback, GetSequence(), SetSequence(), SetReplicatePlayback(). Auto-play is PlaybackSettings.bAutoPlay; the actor's own bAutoPlay field no longer exists. AReplicatedLevelSequenceActor is a subclass that is always net-relevant.
#include "LevelSequencePlayer.h"
#include "MovieSceneSequencePlaybackSettings.h"
// LevelSequencePlayer.h:106
// static ULevelSequencePlayer* CreateLevelSequencePlayer(
// UObject* WorldContextObject, ULevelSequence* LevelSequence,
// FMovieSceneSequencePlaybackSettings Settings, ALevelSequenceActor*& OutActor);
FMovieSceneSequencePlaybackSettings Settings;
Settings.bAutoPlay = false;
Settings.PlayRate = 1.0f;
Settings.StartTime = 0.0f; // seconds into the playback range
Settings.LoopCount.Value = 0; // 0 = once, -1 = infinite, N = N extra loops
Settings.bDisableMovementInput = true;
Settings.bDisableLookAtInput = true;
Settings.bHidePlayer = false;
Settings.bHideHud = true;
Settings.bDisableCameraCuts = false;
Settings.bPauseAtEnd = false;
Settings.bDynamicWeighting = false; // set true (or enable it on the asset) before using SetWeight() — MovieSceneSequencePlayer.h:278
Settings.FinishCompletionStateOverride = EMovieSceneCompletionModeOverride::ForceRestoreState;
ALevelSequenceActor* OutActor = nullptr;
ULevelSequencePlayer* Player = ULevelSequencePlayer::CreateLevelSequencePlayer(
this, CutsceneAsset, Settings, OutActor);
ActiveSequenceActor = OutActor; // UPROPERTY member — otherwise both are collected
ActivePlayer = Player; // UPROPERTY member
// Remaining fields: bRandomStartTime, TickInterval, bInheritTickIntervalFromOwnerPlayer->Play();
Player->PlayReverse();
Player->PlayLooping(-1); // -1 = infinite
Player->ChangePlaybackDirection();
Player->Pause();
Player->Scrub();
Player->Stop(); // resets the cursor and fires OnStop
Player->StopAtCurrentTime();
Player->GoToEndAndStop();
Player->SetPlayRate(0.5f);
Player->SetFrameRange(0, 60); // (StartFrame, Duration) in display-rate frames
Player->SetTimeRange(0.0f, 2.5f); // (StartTime, Duration) in seconds
// Seek without firing the events in between
Player->SetPlaybackPosition(
FMovieSceneSequencePlaybackParams(FFrameTime(120), EUpdatePositionMethod::Jump));
// Advance to a frame, firing every event along the way
Player->PlayTo(
FMovieSceneSequencePlaybackParams(FFrameTime(240), EUpdatePositionMethod::Play),
FMovieSceneSequencePlayToParams());
// Seconds instead of frames: FMovieSceneSequencePlaybackParams(2.5f, EUpdatePositionMethod::Jump)
const bool bPlaying = Player->IsPlaying();
const FQualifiedFrameTime Now = Player->GetCurrentTime();
const FQualifiedFrameTime Dur = Player->GetDuration();
const FFrameRate Rate = Player->GetFrameRate();EUpdatePositionMethod is Play, Jump or Scrub. FMovieSceneSequencePlaybackParams has constructors taking FFrameTime, float seconds, an FString marked-frame name, or an FTimecode.
// UPROPERTY(BlueprintAssignable) FOnMovieSceneSequencePlayerEvent — dynamic, no parameters
Player->OnPlay.AddDynamic(this, &AMyCutsceneManager::HandleSequencePlay);
Player->OnStop.AddDynamic(this, &AMyCutsceneManager::HandleSequenceStop);
Player->OnFinished.AddDynamic(this, &AMyCutsceneManager::HandleSequenceFinished);
Player->OnPause.AddDynamic(this, &AMyCutsceneManager::HandleSequencePause);
Player->OnNativeFinished.BindUObject(this, &AMyCutsceneManager::HandleNativeFinished); // native
// LevelSequencePlayer.h:27 — DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(
// FOnLevelSequencePlayerCameraCutEvent, UCameraComponent*, CameraComponent)
Player->OnCameraCut.AddDynamic(this, &AMyCutsceneManager::HandleCameraCut);OnFinished fires only when playback ends naturally (a natural end fires OnStop too); an explicit Stop() fires only OnStop. Bind before Play().
A possessable resolves to an actor that already exists in the level. A spawnable is created and destroyed by the sequence itself. Possessables outlive the sequence; spawnables do not. Runtime overrides apply to possessables.
Tag the object binding in the Sequencer editor (right-click the binding, then Tags), and override by tag from C++ — tags survive re-binding, GUIDs do not.
#include "LevelSequenceActor.h"
#include "MovieSceneObjectBindingID.h"
// LevelSequenceActor.h:178-253
SeqActor->SetBindingByTag(FName("Hero"), TArray<AActor*>{ HeroActor },
/*bAllowBindingsFromAsset=*/ false);
SeqActor->AddBindingByTag(FName("Crowd"), ExtraActor, /*bAllowBindingsFromAsset=*/ true);
SeqActor->RemoveBindingByTag(FName("Crowd"), ExtraActor);
// GUID form — expose the ID so a designer can pick the binding in the details panel:
// UPROPERTY(EditAnywhere, Category = "Cinematics") FMovieSceneObjectBindingID HeroBindingID;
SeqActor->SetBinding(HeroBindingID, TArray<AActor*>{ HeroActor }, false);
SeqActor->AddBinding(HeroBindingID, HeroActor, false);
SeqActor->RemoveBinding(HeroBindingID, HeroActor);
SeqActor->ResetBinding(HeroBindingID); // back to whatever the asset says
SeqActor->ResetBindings(); // clear every override
const FMovieSceneObjectBindingID Found = SeqActor->FindNamedBinding(FName("Hero"));
const TArray<FMovieSceneObjectBindingID>& All = SeqActor->FindNamedBindings(FName("Crowd"));
// What is actually bound right now
TArray<UObject*> Bound = Player->GetBoundObjects(HeroBindingID);FMovieSceneObjectBindingID keeps its guid and sequence id private. Read them with GetGuid(), GetRelativeSequenceID() and IsFixedBinding(); move an ID across a sub-sequence hierarchy with ResolveToFixed(), then ConvertToRelative() on the resulting UE::MovieScene::FFixedObjectBindingID (ConvertToRelative is not a member of FMovieSceneObjectBindingID, MovieSceneObjectBindingID.h:113-160,341). Never assign the fields directly.
ALevelSequenceActor implements IMovieScenePlaybackClient::GetInstanceData. Set bOverrideInstanceData and supply a UDefaultLevelSequenceInstanceData to offset every absolute transform section, so one authored cutscene can play anywhere in the world.
#include "DefaultLevelSequenceInstanceData.h"
UDefaultLevelSequenceInstanceData* Data =
NewObject<UDefaultLevelSequenceInstanceData>(SeqActor);
Data->TransformOriginActor = StageMarkerActor; // or leave null and set TransformOrigin
SeqActor->DefaultInstanceData = Data;
SeqActor->bOverrideInstanceData = true;An event key does not call a loose global function. FMovieSceneEvent stores a compiled UFunction pointer, and the evaluation system calls it on the sequence's director instance — an object of the class in ULevelSequence::DirectorClass, which derives from ULevelSequenceDirector. The UFUNCTION must therefore be a member of a ULevelSequenceDirector subclass or of its Director Blueprint.
Rules the engine enforces:
MovieSceneEvent.h:70 — the endpoint takes no parameters, or exactly one pass-by-value object/interface parameter, and returns nothing.MovieSceneEventSystems.cpp:206-213). ULevelSequencePlayer::GetEventContexts returns the persistent level's ALevelScriptActor plus one per streaming level — not the UWorld.UFUNCTION carries CallInEditor.// MyCinematicDirector.h
#pragma once
#include "LevelSequenceDirector.h"
#include "MovieSceneObjectBindingID.h"
#include "MyCinematicDirector.generated.h"
class AActor;
UCLASS(Blueprintable)
class MYGAME_API UMyCinematicDirector : public ULevelSequenceDirector
{
GENERATED_BODY()
public:
/** Event endpoint with no parameters. */
UFUNCTION(BlueprintCallable, CallInEditor, Category = "Cinematics")
void OnExplosionCue();
/** Event endpoint on an object-binding track: receives the bound actor. */
UFUNCTION(BlueprintCallable, CallInEditor, Category = "Cinematics")
void OnActorCue(AActor* BoundActor);
/** Assign in the Director Blueprint's class defaults using the Get Sequence Binding node. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cinematics")
FMovieSceneObjectBindingID HeroBinding;
};// MyCinematicDirector.cpp
#include "MyCinematicDirector.h"
#include "LevelSequencePlayer.h"
#include "GameFramework/Actor.h"
void UMyCinematicDirector::OnExplosionCue()
{
// GetBoundObjects and Player are both declared on ULevelSequenceDirector.
for (UObject* Object : GetBoundObjects(HeroBinding))
{
if (AActor* Hero = Cast<AActor>(Object))
{
Hero->SetActorHiddenInGame(true);
}
}
if (Player)
{
Player->SetPlayRate(0.25f);
}
}
void UMyCinematicDirector::OnActorCue(AActor* BoundActor)
{
if (BoundActor)
{
BoundActor->SetActorTickEnabled(false);
}
}To attach it: open the Level Sequence, open its Director Blueprint from the Sequencer toolbar, and reparent that Blueprint to UMyCinematicDirector (Class Settings, Parent Class). Sequencer compiles the Blueprint into ULevelSequence::DirectorClass; one director instance is created per sequence during evaluation, and ULevelSequenceDirector::Player points at the owning player. ULevelSequenceDirector also exposes GetBoundObject, GetBoundActor, GetBoundActors, GetSequence, GetCurrentTime, GetRootSequenceTime and a BlueprintImplementableEvent OnCreated.
The track classes involved are UMovieSceneEventTrack (with bFireEventsWhenForwards), UMovieSceneEventTriggerSection for one-shot keys and UMovieSceneEventRepeaterSection for a key that fires on every pass. Seeking with EUpdatePositionMethod::Jump skips every event in between; use PlayTo when the events must fire.
#include "MovieScene.h"
#include "MovieSceneSpawnable.h"
#include "MovieScenePossessable.h"
UMovieScene* MS = SeqActor->GetSequence()->GetMovieScene();
const FFrameRate DisplayRate = MS->GetDisplayRate();
const FFrameRate TickResolution = MS->GetTickResolution();
const TRange<FFrameNumber> Range = MS->GetPlaybackRange();
for (int32 Index = 0; Index < MS->GetPossessableCount(); ++Index)
{
const FMovieScenePossessable& Possessable = MS->GetPossessable(Index);
const FGuid Guid = Possessable.GetGuid(); // also GetName, GetPossessedObjectClass
}
for (int32 Index = 0; Index < MS->GetSpawnableCount(); ++Index)
{
const FMovieSceneSpawnable& Spawnable = MS->GetSpawnable(Index); // GetGuid, GetName
}
const TArray<UMovieSceneTrack*>& RootTracks = MS->GetTracks();
if (const FMovieSceneBinding* Binding = MS->FindBinding(SomeGuid))
{
for (UMovieSceneTrack* Track : Binding->GetTracks()) { /* Cast to a concrete type */ }
}Track class (MovieSceneTracks) | Animates |
|---|---|
UMovieScene3DTransformTrack | Actor and component transforms |
UMovieSceneSkeletalAnimationTrack | Skeletal mesh animation |
UMovieSceneCameraCutTrack | Which camera the viewport uses |
UMovieSceneEventTrack | Director function calls |
UMovieSceneAudioTrack | Sound assets |
UMovieSceneFadeTrack | Screen fade |
UMovieScenePropertyTrack | Base class for property animation |
UMovieScenePropertyTrack subclasses drive a named UPROPERTY marked Interp: UMovieSceneFloatTrack produces UMovieSceneFloatSection, which stores an FMovieSceneFloatChannel; UMovieSceneBoolTrack and UMovieSceneColorTrack follow the same shape. UMovieSceneSubTrack and UMovieSceneSubSection live in MovieScene, not MovieSceneTracks.
#include "Tracks/MovieSceneSubTrack.h"
#include "Sections/MovieSceneSubSection.h"
UMovieSceneSubTrack* SubTrack = RootMovieScene->AddTrack<UMovieSceneSubTrack>();
const FFrameNumber Start = (2.0 * RootMovieScene->GetTickResolution()).FloorToFrame();
const int32 Duration = (5.0 * RootMovieScene->GetTickResolution()).FloorToFrame().Value;
UMovieSceneSubSection* SubSection = SubTrack->AddSequence(ChildSequence, Start, Duration);
SubSection->Parameters.TimeScale.Set(1.0); // FMovieSceneTimeWarpVariant — Set(), not assignment
SubSection->Parameters.bCanLoop = false;
SubSection->Parameters.StartFrameOffset = FFrameNumber(0);Sub-section offsets and durations are in tick-resolution frames, not display-rate frames. UE::MovieScene::DiscreteSize, DiscreteInclusiveLower and DiscreteExclusiveUpper in MovieSceneTimeHelpers.h turn a TRange<FFrameNumber> into frame counts.
This section covers cameras a sequence drives. Gameplay cameras, camera modifiers, camera shakes and view-target blending belong to ue-gameplay-cameras.
#include "CineCameraActor.h"
#include "CineCameraComponent.h"
#include "CineCameraSettings.h"
ACineCameraActor* Cam = GetWorld()->SpawnActor<ACineCameraActor>(SpawnLocation, SpawnRotation);
UCineCameraComponent* CineComp = Cam->GetCineCameraComponent();
FCameraFilmbackSettings Filmback; // SensorWidth / SensorHeight in mm
Filmback.SensorWidth = 36.0f;
Filmback.SensorHeight = 24.0f;
CineComp->SetFilmback(Filmback); // SensorAspectRatio is derived, not settable
FCameraLensSettings Lens; // mm and f-stops
Lens.MinFocalLength = 35.0f;
Lens.MaxFocalLength = 35.0f;
Lens.MinFStop = 1.4f;
Lens.MaxFStop = 16.0f;
Lens.MinimumFocusDistance = 30.0f;
Lens.DiaphragmBladeCount = 7;
CineComp->SetLensSettings(Lens);
FCameraFocusSettings Focus;
Focus.FocusMethod = ECameraFocusMethod::Manual; // DoNotOverride|Manual|Tracking|Disable
Focus.ManualFocusDistance = 500.0f; // cm
Focus.bSmoothFocusChanges = true;
Focus.FocusSmoothingInterpSpeed = 8.0f;
CineComp->SetFocusSettings(Focus);
CineComp->SetCurrentFocalLength(35.0f); // mm; UPROPERTY(Interp) so Sequencer can key it
CineComp->SetCurrentAperture(2.0f); // f-stop; also Interp
Cam->LookatTrackingSettings.bEnableLookAtTracking = true;
Cam->LookatTrackingSettings.ActorToTrack = TargetActor; // TSoftObjectPtr<AActor>
Cam->LookatTrackingSettings.RelativeOffset = FVector(0.f, 0.f, 80.f);
Cam->LookatTrackingSettings.LookAtTrackingInterpSpeed = 4.0f;CurrentFocusDistance and CurrentHorizontalFOV are read-only; query the field of view with GetHorizontalFieldOfView() and GetVerticalFieldOfView(). Presets go through SetFilmbackPresetByName, SetLensPresetByName and SetCropPresetByName.
Attach a camera to a rig and key the rig's Interp properties in Sequencer instead of hand-animating the camera transform:
#include "CameraRig_Rail.h"
#include "CameraRig_Crane.h"
Rail->CurrentPositionOnRail = 0.35f; // 0..1 along the spline
Rail->bLockOrientationToRail = true;
USplineComponent* RailSpline = Rail->GetRailSplineComponent();
Crane->CraneArmLength = 400.0f; // cm
Crane->CranePitch = 12.0f; // degrees
Crane->CraneYaw = -45.0f;
Crane->bLockMountPitch = true; // also bLockMountYawBoth rigs override GetDefaultAttachComponent(), so attaching the camera as a child puts it on the correct mount.
Movie Render Graph is production-ready in 5.8 and is the path to prefer for new work. A UMovieGraphConfig is a node graph of UMovieGraphNode subclasses (UMovieGraphSettingNode for settings, UMovieGraphRenderPassNode for passes, UMovieGraphGlobalOutputSettingNode for resolution and output paths); UMovieGraphPipeline executes it through Initialize(UMoviePipelineExecutorJob*, const FMovieGraphInitConfig&).
Runtime rendering goes through UMoviePipelineQueueEngineSubsystem, a UEngineSubsystem in MovieRenderPipelineCore. The editor-facing UMoviePipelineQueueSubsystem is a UEditorSubsystem in MovieRenderPipelineEditor and cannot be referenced from runtime code — doing so breaks a packaged build.
#include "MoviePipelineQueueEngineSubsystem.h"
#include "MoviePipelineQueue.h"
#include "Graph/MovieGraphConfig.h"
UMoviePipelineQueueEngineSubsystem* RenderSubsystem =
GEngine->GetEngineSubsystem<UMoviePipelineQueueEngineSubsystem>();
if (!RenderSubsystem || RenderSubsystem->IsRendering())
{
return;
}
UMoviePipelineExecutorJob* Job = RenderSubsystem->AllocateJob(ShotSequence);
Job->JobName = TEXT("Shot_0010");
Job->Map = FSoftObjectPath(GetWorld());
Job->SetGraphPreset(RenderGraphAsset); // UMovieGraphConfig*
RenderSubsystem->OnRenderFinished.AddDynamic(this, &AMyRenderDirector::HandleRenderFinished);
RenderSubsystem->RenderJob(Job);AllocateJob clears the queue, so it renders exactly one job; for a batch call GetQueue()->AllocateNewJob(UMoviePipelineExecutorJob::StaticClass()) per job and then RenderQueueWithExecutor(UMoviePipelineInProcessExecutor::StaticClass()). Custom executors subclass UMoviePipelineExecutorBase (override Execute_Implementation and IsRendering_Implementation) or UMoviePipelineLinearExecutorBase, which already walks the queue and leaves Start(const UMoviePipelineExecutorJob*) to you.
Render layers are a world feature: UMovieGraphRenderLayerSubsystem is a UWorldSubsystem reached with UMovieGraphRenderLayerSubsystem::GetFromWorld(World), holding UMovieGraphRenderLayer objects. Add modifiers with UMovieGraphRenderLayer::AddLayerModifier(UMovieGraphModifierBase*), read them with GetLayerModifiers() (Blueprint only — not exported from the MinimalAPI class, Graph/MovieGraphRenderLayerSubsystem.h:1216), drop them with RemoveLayerModifier(), and switch layers with SetActiveRenderLayerByName or ClearActiveRenderLayer.
Legacy Movie Render Queue — still shipped and supported, but not the default for new graphs. UMoviePipeline is the executing object, configured by a UMoviePipelinePrimaryConfig holding UMoviePipelineSetting objects, reached with FindOrAddSettingByClass / FindSettingByClass. UMoviePipelineOutputSetting lives in MovieRenderPipelineCore (OutputDirectory, FileNameFormat, OutputResolution, bUseCustomFrameRate, OutputFrameRate, ZeroPadFrameNumbers); the passes and containers (UMoviePipelineDeferredPassBase, UMoviePipelineImageSequenceOutput_PNG, UMoviePipelineImageSequenceOutput_EXR) live in MovieRenderPipelineRenderPasses, which must be added to Build.cs separately. A job is either graph-configured (SetGraphPreset, IsUsingGraphConfiguration()) or legacy-configured (SetConfiguration, IsUsingBasicConfiguration()) — never both.
DaySequence (Experimental in 5.8) builds on MovieScene for time-of-day; it is a separate asset type and the APIs above do not transfer to it unchanged.
| Do not emit | Use in 5.8 | Source |
|---|---|---|
SeqActor->SequencePlayer | SeqActor->GetSequencePlayer() | UE_DEPRECATED(5.4) in LevelSequenceActor.h:86 |
SeqActor->bAutoPlay | SeqActor->PlaybackSettings.bAutoPlay | bAutoPlay_DEPRECATED in LevelSequenceActor.h:109 |
non-const MovieScene->GetBindings() | const GetBindings() | UE_DEPRECATED(5.7) in MovieScene.h:782 |
FMovieSceneBinding::GetName / SetName | FMovieScenePossessable::GetName, FMovieSceneSpawnable::GetName | UE_DEPRECATED(5.7) in MovieSceneBinding.h:89 |
MovieScene->GetSoloNodes() / GetMuteNodes() | FindDecoration | UE_DEPRECATED(5.7) in MovieScene.h:978 |
MovieScene->OnChannelChanged() | OnChannelChangedWithTime() | UE_DEPRECATED(5.8) in MovieScene.h:993 |
RenderLayer->AddModifier() / GetModifiers() / RemoveModifier() | AddLayerModifier() / GetLayerModifiers() / RemoveLayerModifier() | UE_DEPRECATED(5.7) in Graph/MovieGraphRenderLayerSubsystem.h:1204-1218 |
ConditionGroup->Evaluate() | EvaluateActorsAndComponents() | UE_DEPRECATED(5.6) in Graph/MovieGraphRenderLayerSubsystem.h:817 |
GetEffectiveOutputResolution() | GetOverscannedResolution() | UE_DEPRECATED(5.6) in MoviePipelineBlueprintLibrary.h:154 |
GameModeOverride | SoftGameModeOverride | UE_DEPRECATED(5.5) in MoviePipelineGameOverrideSetting.h:77 |
RendererName member | GetRendererName() | UE_DEPRECATED(5.7) in Graph/Nodes/MovieGraphBurnInNode.h:43 |
Section->Parameters.TimeScale = 1.0 | Parameters.TimeScale.Set(1.0) | explicit ctor, Variants/MovieSceneTimeWarpVariant.h:66 |
UFUNCTION on a free function for an event track: a UFUNCTION is only legal inside a UCLASS or USTRUCT body, and Sequencer calls event endpoints on the director instance. Put the endpoint on a ULevelSequenceDirector subclass, with no parameters or one object parameter.
Endpoint with the wrong signature: void Foo(FName Tag, int32 Index) will never bind. The engine accepts no parameters, or one pass-by-value object/interface parameter, and no return value.
Nothing fires in the Sequencer preview: non-game worlds skip endpoints whose UFUNCTION lacks CallInEditor.
Binding after Play(): frame 0 has already evaluated against the asset binding. Call SetBindingByTag or SetBinding on the ALevelSequenceActor before Play().
Losing the spawned actor: CreateLevelSequencePlayer hands back a raw ALevelSequenceActor*. Store it and the player in UPROPERTY() members or they are garbage collected mid-cutscene.
Camera never returns to the player: the camera cut track restores the previous view target only when its section resolves to Restore State (Level Sequences default to it, DefaultCompletionMode=RestoreState in BaseEngine.ini; restore in MovieSceneCameraCutGameHandler.cpp:115-124), and cinematic mode is undone on stop (LevelSequencePlayer.cpp:177). With a Keep State section, ForceKeepState or bPauseAtEnd, handle OnFinished and call PC->SetViewTargetWithBlend(PC->GetPawn(), 0.5f, VTBlend_Cubic) yourself.
Skipping leaves actors mid-pose: set Settings.FinishCompletionStateOverride = EMovieSceneCompletionModeOverride::ForceRestoreState, or call SetCompletionModeOverride, before Stop().
Touching UMoviePipelineQueueSubsystem from game code: it is a UEditorSubsystem in MovieRenderPipelineEditor. Runtime renders use UMoviePipelineQueueEngineSubsystem from MovieRenderPipelineCore.
Mixing graph and legacy config on one job: SetGraphPreset and SetConfiguration are mutually exclusive. Check IsUsingGraphConfiguration() before assuming GetConfiguration() is valid.
Frame-rate confusion: SetFrameRange uses display-rate frames, while UMovieSceneSubSection offsets and UMovieScene::GetPlaybackRange use tick-resolution frames. Convert with GetDisplayRate() and GetTickResolution().
Assuming camera cuts replicate: cuts are evaluated per client. Use SetReplicatePlayback(true), or AReplicatedLevelSequenceActor, so the server drives playback time and each client applies its own cut.
ue-animation-system — skeletal animation assets, montages and anim notifies that sequence animation tracks playue-gameplay-cameras — gameplay cameras, camera modifiers, camera shakes and view-target blending outside Sequencerue-audio-system — the sound assets, submixes and attenuation behind sequence audio tracksue-niagara-effects — particle systems a cinematic triggers or that a sequence keysue-materials-rendering — post process, Lumen and material setup that render passes captureue-actor-component-architecture — spawning and owning the actors a sequence possessesue-world-level-streaming — streaming levels in before a cutscene and Data Layer state during a render© quodsoler, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in skills/ue-sequencer-cinematics of quodsoler/unreal-engine-skills.
Open the folder on GitHubat commit f3742d7
Ue Sequencer Cinematics next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ue Sequencer Cinematics this skillquodsoler/unreal-engine-skills | 362 | — | ~7.3k | Automated safety check: Pass | MIT | |
| Ue Specifiersfjz13/UnrealSpecifiers | 1.1k | — | ~1.4k | Automated safety check: Pass | Custom licence | |
| Validate GsdkPlayFab/gsdk | 170 | — | ~645 | Automated safety check: Pass | Apache-2.0 | |
| Unreal Engine MCPEpicGames/unreal-engine-skills-for-claude-code-plugin | 338 | — | ~1.8k | Automated safety check: Pass | MIT | |
| Sokol Netelix22/Sokol.NET | 154 | — | ~2.8k | Automated safety check: Pass | MIT | |
| Gdextension Hygienemicrosoft/XBOX-Godot-Sample | 237 | — | ~983 | Automated safety check: Pass | MIT |
fjz13/UnrealSpecifiers
A skill your agent uses when writing, editing, reviewing, validating, or explaining Unreal Engine C++ reflected declarations: UCLASS, USTRUCT, UENUM, UINTERFACE, UPROPERTY, UFUNCTION, UPARAM, UMETA…
PlayFab/gsdk
Validates PlayFab Game Server SDK (GSDK) integrations in game server projects.
EpicGames/unreal-engine-skills-for-claude-code-plugin
Drives a live Unreal Editor through the unreal-mcp server: spawn actors, edit Blueprints, materials and sequences, change properties and trigger Live Coding.
elix22/Sokol.NET
Sokol.NET framework development — use for ANY work in this repo: creating or debugging examples, building/running for desktop/Android/iOS/Web, writing or compiling shaders, adding a new C/C++…
microsoft/XBOX-Godot-Sample
Run a Godot/GDExtension finish pass over the current diff: enforce headless GDScript validation, public API docclasses coverage, docs/spec/sample/test synchronization, and registration or CMake…
intrinsic-ai/intrinsic-core
Intrinsic Solution Building Library (SBL) Python SDK guide for connecting to workcells, composing Behavior Trees, querying/mutating ObjectWorld frames, binding equipment resources, and orchestrating…
quodsoler/unreal-engine-skills
Unreal Engine C++ guidance for AActor and UActorComponent: lifecycle hooks, spawning, component creation and attachment, ticking, interfaces and composition.
quodsoler/unreal-engine-skills
Guides Unreal Engine C++ AI work across AI controllers, behavior trees, blackboards, perception, navmesh pathfinding, EQS and Smart Objects.
quodsoler/unreal-engine-skills
Reference for writing and debugging Unreal Engine 5.8 animation C++: AnimInstance and proxy, montages, notifies, curves, blend spaces, state machines, linked layers and root motion.
quodsoler/unreal-engine-skills
Picks and applies the right Unreal Engine C++ concurrency API, from UE::Tasks and FPipe to ParallelFor, FRunnable, locks and timers, with game-thread safety rules.
quodsoler/unreal-engine-skills
A skill your agent uses when playing, mixing or debugging sound in Unreal Engine — one-shot SFX, looping ambience, music, dialogue or procedural audio.
quodsoler/unreal-engine-skills
Reference for exposing Unreal Engine C++ to Blueprint and calling Blueprint from C++, covering UFUNCTION and UPROPERTY specifiers, latent and async nodes, and interfaces.
Works with
Categories
A skill your agent uses when playing Level Sequences from C++, building cutscenes or in-game camera moments, binding actors to sequence tracks at runtime, wiring Sequencer event tracks, or rendering…. Ue Sequencer Cinematics is an agent skill from quodsoler/unreal-engine-skills. Use when playing Level Sequences from C++, building cutscenes or in-game camera moments, binding actors to sequence tracks at runtime, wiring Sequencer event tracks, or rendering with Movie Render Graph.
Ue Sequencer Cinematics fits situations like: playing Level Sequences from C++; building cutscenes; in-game camera moments; binding actors to sequence tracks at runtime.
Run `npx skills add quodsoler/unreal-engine-skills --skill ue-sequencer-cinematics -a claude-code`. Or copy the skill folder (skills/ue-sequencer-cinematics in quodsoler/unreal-engine-skills) into .claude/skills/ue-sequencer-cinematics in your project. Claude Code loads it when a task matches its description.
Run `npx skills add quodsoler/unreal-engine-skills --skill ue-sequencer-cinematics -a codex`. Or copy the skill folder (skills/ue-sequencer-cinematics in quodsoler/unreal-engine-skills) into .agents/skills/ue-sequencer-cinematics in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add quodsoler/unreal-engine-skills --skill ue-sequencer-cinematics -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ue-sequencer-cinematics, .gemini/skills/ue-sequencer-cinematics, .github/skills/ue-sequencer-cinematics and .opencode/skills/ue-sequencer-cinematics in your project.
SKILL.md names no scripts, command-line tools or credentials: Ue Sequencer Cinematics is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Ue Sequencer Cinematics is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.3k tokens (SKILL.md is roughly 29k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 8.6k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Ue Sequencer Cinematics: Ue Specifiers (fjz13/UnrealSpecifiers, 1.1k stars), Validate Gsdk (PlayFab/gsdk, 170 stars), Unreal Engine MCP (EpicGames/unreal-engine-skills-for-claude-code-plugin, 338 stars) and Sokol Net (elix22/Sokol.NET, 154 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
quodsoler (a GitHub user) maintains it in quodsoler/unreal-engine-skills, which has 362 GitHub stars. The repository holds 31 skills in this directory. The repository was last updated on September 28, 2026.
Source: quodsoler/unreal-engine-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.