ue-sequencer-cinematics について
Unreal Engine 5.8 開発者向けの Sequencer とシネマティクスのスキルです。5.8 のヘッダーで確認された API をもとに、再生、バインディング、イベントトラック、カメラ、レンダリングを案内します。
主な機能
- 01Sequencer モジュール依存関係の案内
- 02ランタイム再生とバインディング
- 03イベントトラックの呼び出し規則
- 04MovieScene データモデルの解説
- 05シネマカメラとレンダリングの案内
活用シーン
- 01ゲーム内カットシーンの再生実装
- 02シーケンスとランタイム Actor のバインド
- 03タイムラインイベントからの C++ 呼び出し
- 04シーケンスデータとオフラインレンダリングの設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ quodsoler/ unreal-engine-skills --skill ue-sequencer-cinematicsインストール後、Claude Code で/ue-sequencer-cinematicsを入力して読み込まれたか確認します。
同梱ファイルreferences/sequencer-patterns.md
詳細
UE シーケンサーとシネマティクス
対象エンジン:UE 5.8。以下の API は 5.8 のヘッダーで検証済みです。古い形式は「非推奨 — 使用しないでください」に記載しています。
Sequencer は 3 つのランタイムモジュールと 1 つのプラグインにまたがります。MovieScene はデータモデルとプレイヤーの基底クラスを保持し、MovieSceneTracks は具体的なトラックとセクションの型を保持し、LevelSequence はアセット、アクター、プレイヤー、ディレクターを保持し、CinematicCamera はシネカメラとカメラリグを保持します。オフラインレンダリングは Movie Render Queue プラグイン(ランタイム用の MovieRenderPipelineCore、エディターキュー UI 用の MovieRenderPipelineEditor)で行います。このプラグインはデフォルトで無効になっているため、.uproject で有効にする必要があります。
コンテキスト
.agents/ue-project-context.md が存在する場合は読み込んでください(モジュール名、規約、有効なプラグイン、GAS/ネットワーク設定)。ファイルが見つからなくても作業を中断しないでください。
依頼内容とコードベースから対象領域を特定してください。解釈によって異なるコードが必要になる場合に限り、質問してください。
| 依頼内容 | 参照先 |
|---|---|
| Build.cs に追加するモジュール | Build.cs モジュール |
| ランタイムとエディター専用の C++ 機能 | ランタイムとエディター |
| シーケンスの再生、停止、シーク、ループ | Level Sequence の再生 |
| シーケンストラックをゲームプレイアクターに割り当てる | ランタイムでのアクターのバインド |
| タイムライン上のキーから C++ を呼び出す | Sequencer イベントトラック |
| トラック、セクション、サブシーケンス、フレーム計算 | MovieScene データモデル |
| シネカメラの設定、フォーカス、レール、クレーン | シネカメラとカメラリグ |
| フレームや動画をディスクにレンダリングする | Movie Render Graph |
| カットシーン、マルチプレイヤー、リグの実例全般 | Sequencer のランタイムパターン |
Build.cs モジュール
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");
ランタイムとエディター
シーケンスの作成はエディターで行います。製品版ゲームのコードではシーケンスを再生して再バインドしますが、作成は行いません。
| タスク | API | 利用可否 |
|---|---|---|
| 再生、停止、シーク、再生レートの設定 | UMovieSceneSequencePlayer | ランタイム |
| バインド先として解決されるアクターの上書き | ALevelSequenceActor::SetBinding* | ランタイム |
| トラック、バインディング、フレームレートの読み取り | UMovieScene のゲッター、UMovieSceneSequence::GetMovieScene | ランタイム |
| タイムラインからの C++ 呼び出し | ULevelSequenceDirector のサブクラス | ランタイム |
| レンダリングのキュー登録と実行 | UMoviePipelineQueueEngineSubsystem(UEngineSubsystem) | ランタイム |
| アクター、カメラ、スポーナブルのシーケンスへの追加 | ULevelSequenceEditorSubsystem(UEditorSubsystem) | エディター専用 |
| スクリプトによるトラック/セクションの作成とキー設定 | UMovieSceneSequenceExtensions(Beta SequencerScripting プラグインの Runtime モジュール) | エディタースクリプティング — アセットを変更 |
| カスタムトラックエディターの登録 | ISequencerModule::RegisterTrackEditor | エディター専用 |
| Movie Render Queue ウィンドウの操作 | UMoviePipelineQueueSubsystem(UEditorSubsystem) | エディター専用 |
UMovieScene::AddTrack と UMovieSceneSubTrack::AddSequence はランタイムビルドにもコンパイルされますが、シーケンスアセットを変更します。これらはエディターツールまたはコマンドレットからのみ呼び出してください。クック済みの ULevelSequence を製品版ゲーム内で編集してはいけません。
Level Sequence の再生
配置済みの ALevelSequenceActor から
#include "LevelSequenceActor.h"
// LevelSequenceActor.h:153 — UFUNCTION(BlueprintGetter) ULevelSequencePlayer* GetSequencePlayer() const;
if (ULevelSequencePlayer* Player = SeqActor->GetSequencePlayer())
{
Player->Play();
}
便利な ALevelSequenceActor メンバー:PlaybackSettings、LevelSequenceAsset、BindingOverrides、DefaultInstanceData、bOverrideInstanceData、bReplicatePlayback、GetSequence()、SetSequence()、SetReplicatePlayback()。自動再生は PlaybackSettings.bAutoPlay で設定します。アクター自身の bAutoPlay フィールドはすでに存在しません。AReplicatedLevelSequenceActor は、常にネットワーク関連として扱われるサブクラスです。
ランタイムでプレイヤーをスポーンする
#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, bInheritTickIntervalFromOwner
再生制御
Player->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 は Play、Jump、または Scrub です。FMovieSceneSequencePlaybackParams には、FFrameTime、秒数を表す float、マークされたフレームの名前を表す FString、または 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 が発火するのは、再生が自然に終了した場合のみです(自然終了時には OnStop も発火します)。明示的に Stop() を呼び出した場合は、OnStop のみが発火します。Play() の前にバインドしてください。
実行時のアクターのバインド
Possessable は、レベルにすでに存在するアクターに解決されます。Spawnable はシーケンス自体によって生成および破棄されます。Possessable はシーケンスの終了後も存続しますが、Spawnable は存続しません。実行時のオーバーライドは Possessable に適用されます。
Sequencer エディターでオブジェクトバインディングにタグを付け(バインディングを右クリックし、Tags を選択)、C++ からタグを使ってオーバーライドします。タグは再バインド後も維持されますが、GUID は維持されません。
#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 は guid と sequence id を非公開にしています。GetGuid()、GetRelativeSequenceID()、IsFixedBinding() で読み取ります。サブシーケンス階層をまたいで ID を移動するには、ResolveToFixed() を呼び出し、結果の UE::MovieScene::FFixedObjectBindingID に対して ConvertToRelative() を呼び出します(ConvertToRelative は FMovieSceneObjectBindingID のメンバーではありません。MovieSceneObjectBindingID.h:113-160,341)。フィールドを直接代入しないでください。
シーケンス全体の配置変更
ALevelSequenceActor は IMovieScenePlaybackClient::GetInstanceData を実装しています。bOverrideInstanceData を設定し、UDefaultLevelSequenceInstanceData を指定すると、すべての絶対トランスフォームセクションをオフセットできます。これにより、作成したカットシーンをワールド内の任意の場所で再生できます。
#include "DefaultLevelSequenceInstanceData.h"
UDefaultLevelSequenceInstanceData* Data =
NewObject<UDefaultLevelSequenceInstanceData>(SeqActor);
Data->TransformOriginActor = StageMarkerActor; // or leave null and set TransformOrigin
SeqActor->DefaultInstanceData = Data;
SeqActor->bOverrideInstanceData = true;
Sequencer イベントトラック
イベントキーは、名前だけのグローバル関数を呼び出すわけではありません。FMovieSceneEvent はコンパイル済みの UFunction ポインターを保持し、評価システムはシーケンスのディレクターインスタンスでその関数を呼び出します。これは ULevelSequence::DirectorClass で指定されたクラス(ULevelSequenceDirector の派生クラス)のオブジェクトです。そのため、UFUNCTION は ULevelSequenceDirector のサブクラス、またはその Director Blueprint のメンバーである必要があります。
エンジンによって次のルールが適用されます。
MovieSceneEvent.h:70— エンドポイントはパラメーターなし、または値渡しのオブジェクト/インターフェースパラメーターをちょうど 1 つ受け取り、戻り値を返さない必要があります。- イベントトラックがオブジェクトバインディングの下にある場合、バインドされたオブジェクトが唯一のパラメーターとして渡されます。
- ルートトラックでは、パラメーターなしのエンドポイントはディレクター上で 1 回実行されます。オブジェクトパラメーターを持つエンドポイントは、グローバルイベントコンテキストごとに 1 回実行されます(
MovieSceneEventSystems.cpp:206-213)。ULevelSequencePlayer::GetEventContextsが返すのは、永続レベルのALevelScriptActorと各ストリーミングレベルのALevelScriptActorです。UWorldは返しません。 - ゲーム以外のワールド(Sequencer プレビュー)では、
UFUNCTIONに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);
}
}
アタッチするには、Level Sequence を開き、Sequencer ツールバーからその Director Blueprint を開いて、Blueprint の親クラスを UMyCinematicDirector に変更します(Class Settings の Parent Class)。Sequencer は Blueprint を ULevelSequence::DirectorClass にコンパイルします。評価中はシーケンスごとに 1 つのディレクターインスタンスが作成され、ULevelSequenceDirector::Player は所有するプレイヤーを指します。また、ULevelSequenceDirector は GetBoundObject、GetBoundActor、GetBoundActors、GetSequence、GetCurrentTime、GetRootSequenceTime と、BlueprintImplementableEvent の OnCreated も公開しています。
関連するトラッククラスは、UMovieSceneEventTrack(bFireEventsWhenForwards を含む)、1 回限りのキー用の UMovieSceneEventTriggerSection、および再生のたびにキーを発火させる UMovieSceneEventRepeaterSection です。EUpdatePositionMethod::Jump でシークすると、その間のイベントはすべてスキップされます。イベントを発火させる必要がある場合は、PlayTo を使用してください。
MovieScene データモデル
#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 */ }
}
トラッククラス(MovieSceneTracks) | アニメーション対象 |
|---|---|
UMovieScene3DTransformTrack | アクターとコンポーネントのトランスフォーム |
UMovieSceneSkeletalAnimationTrack | スケルタルメッシュのアニメーション |
UMovieSceneCameraCutTrack | ビューポートで使用するカメラ |
UMovieSceneEventTrack | Director 関数の呼び出し |
UMovieSceneAudioTrack | サウンドアセット |
UMovieSceneFadeTrack | 画面のフェード |
UMovieScenePropertyTrack | プロパティアニメーションの基底クラス |
UMovieScenePropertyTrack のサブクラスは、Interp が付与された名前付きの UPROPERTY を駆動します。UMovieSceneFloatTrack は FMovieSceneFloatChannel を格納する UMovieSceneFloatSection を生成します。UMovieSceneBoolTrack と UMovieSceneColorTrack も同じ構造です。UMovieSceneSubTrack と UMovieSceneSubSection は MovieSceneTracks ではなく、MovieScene にあります。
#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);
サブセクションのオフセットとデュレーションの単位は、表示レートのフレームではなく、ティック解像度のフレームです。MovieSceneTimeHelpers.h の UE::MovieScene::DiscreteSize、DiscreteInclusiveLower、DiscreteExclusiveUpper は、TRange<FFrameNumber> をフレーム数に変換します。
シネカメラとカメラリグ
このセクションでは、シーケンスで制御するカメラについて説明します。ゲームプレイカメラ、カメラモディファイアー、カメラシェイク、ビューターゲットのブレンドについては、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 と CurrentHorizontalFOV は読み取り専用です。視野角を取得するには、GetHorizontalFieldOfView() と GetVerticalFieldOfView() を使用します。プリセットは SetFilmbackPresetByName、SetLensPresetByName、SetCropPresetByName を通じて設定します。
カメラをリグにアタッチし、カメラのトランスフォームを手動でアニメーションさせるのではなく、Sequencer でリグの Interp プロパティにキーを設定します。
#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 bLockMountYaw
どちらのリグも GetDefaultAttachComponent() をオーバーライドするため、カメラを子としてアタッチすると、正しいマウントに配置されます。
Movie Render Graph
Movie Render Graph は 5.8 で本番環境対応となっており、新規作業で優先すべき方式です。UMovieGraphConfig は UMovieGraphNode のサブクラスによるノードグラフです(設定用の UMovieGraphSettingNode、パス用の UMovieGraphRenderPassNode、解像度と出力パス用の UMovieGraphGlobalOutputSettingNode)。UMovieGraphPipeline は Initialize(UMoviePipelineExecutorJob*, const FMovieGraphInitConfig&) を通じてこれを実行します。
ランタイムレンダリングでは、MovieRenderPipelineCore にある UEngineSubsystem、UMoviePipelineQueueEngineSubsystem を使用します。エディター向けの UMoviePipelineQueueSubsystem は MovieRenderPipelineEditor にある UEditorSubsystem であり、ランタイムコードから参照することはできません。参照すると、パッケージ化したビルドが壊れます。
#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 はキューをクリアするため、レンダリングされるジョブは常に 1 つです。バッチ処理では、ジョブごとに GetQueue()->AllocateNewJob(UMoviePipelineExecutorJob::StaticClass()) を呼び出し、その後 RenderQueueWithExecutor(UMoviePipelineInProcessExecutor::StaticClass()) を呼び出します。カスタムエグゼキューターは UMoviePipelineExecutorBase(Execute_Implementation と IsRendering_Implementation をオーバーライド)または UMoviePipelineLinearExecutorBase をサブクラス化します。後者はすでにキューを処理するため、Start(const UMoviePipelineExecutorJob*) を実装するだけで済みます。
レンダーレイヤーはワールドの機能です。UMovieGraphRenderLayerSubsystem は UWorldSubsystem であり、UMovieGraphRenderLayerSubsystem::GetFromWorld(World) を使って取得でき、UMovieGraphRenderLayer オブジェクトを保持します。UMovieGraphRenderLayer::AddLayerModifier(UMovieGraphModifierBase*) でモディファイアーを追加し、GetLayerModifiers() で読み取ります(Blueprint 専用です。MinimalAPI クラスからエクスポートされていません。Graph/MovieGraphRenderLayerSubsystem.h:1216)。RemoveLayerModifier() で削除し、SetActiveRenderLayerByName または ClearActiveRenderLayer でレイヤーを切り替えます。
レガシーの Movie Render Queue — 引き続き提供・サポートされていますが、新しいグラフのデフォルトではありません。実行オブジェクトは UMoviePipeline で、UMoviePipelineSetting オブジェクトを保持する UMoviePipelinePrimaryConfig によって設定します。設定オブジェクトは FindOrAddSettingByClass / FindSettingByClass で取得します。UMoviePipelineOutputSetting は MovieRenderPipelineCore にあります(OutputDirectory、FileNameFormat、OutputResolution、bUseCustomFrameRate、OutputFrameRate、ZeroPadFrameNumbers)。パスとコンテナ(UMoviePipelineDeferredPassBase、UMoviePipelineImageSequenceOutput_PNG、UMoviePipelineImageSequenceOutput_EXR)は MovieRenderPipelineRenderPasses にあり、Build.cs に個別に追加する必要があります。ジョブはグラフ設定(SetGraphPreset、IsUsingGraphConfiguration())またはレガシー設定(SetConfiguration、IsUsingBasicConfiguration())のいずれか一方を使用します。両方を使用することはできません。
DaySequence(5.8 では Experimental)は、時刻の表現に MovieScene を基盤として使用します。これは別のアセットタイプであり、上記の API をそのまま適用することはできません。
Deprecated — do not use
| 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 を付ける: UFUNCTION は UCLASS または USTRUCT の本体内でのみ有効であり、Sequencer はディレクターインスタンス上のイベントエンドポイントを呼び出します。パラメーターなし、またはオブジェクトパラメーターを1つだけ受け取る ULevelSequenceDirector のサブクラスにエンドポイントを定義してください。
エンドポイントのシグネチャが間違っている: void Foo(FName Tag, int32 Index) はバインドされません。エンジンが受け付けるのは、パラメーターなし、または値渡しのオブジェクト/インターフェースパラメーターを1つだけ受け取る形式で、戻り値はありません。
Sequencer のプレビューで何も実行されない: ゲーム以外のワールドでは、UFUNCTION に CallInEditor がないエンドポイントはスキップされます。
Play() の後にバインドする: フレーム0はすでにアセットのバインディングを使って評価されています。Play() の前に、ALevelSequenceActor で SetBindingByTag または SetBinding を呼び出してください。
スポーンしたアクターを失う: CreateLevelSequencePlayer は生の ALevelSequenceActor* を返します。カットシーンの途中でガベージコレクションされないよう、アクターとプレーヤーを UPROPERTY() メンバーに保存してください。
カメラがプレイヤーに戻らない: カメラカットトラックが以前のビュ一ターゲットを復元するのは、セクションが Restore State として解決される場合のみです(Level Sequences のデフォルトは DefaultCompletionMode=RestoreState で、BaseEngine.ini に設定されています。復元処理は MovieSceneCameraCutGameHandler.cpp:115-124 にあります)。また、停止時にはシネマティックモードが解除されます(LevelSequencePlayer.cpp:177)。Keep State セクション、ForceKeepState、または bPauseAtEnd を使う場合は、OnFinished を処理し、自分で PC->SetViewTargetWithBlend(PC->GetPawn(), 0.5f, VTBlend_Cubic) を呼び出してください。
スキップするとアクターがポーズの途中で止まる: Settings.FinishCompletionStateOverride = EMovieSceneCompletionModeOverride::ForceRestoreState を設定するか、Stop() の前に SetCompletionModeOverride を呼び出してください。
ゲームコードから UMoviePipelineQueueSubsystem にアクセスする: これは MovieRenderPipelineEditor にある UEditorSubsystem です。ランタイムレンダリングでは、MovieRenderPipelineCore の UMoviePipelineQueueEngineSubsystem を使ってください。
1つのジョブでグラフ設定と従来の設定を混在させる: SetGraphPreset と SetConfiguration は相互に排他的です。GetConfiguration() が有効だと決めつける前に、IsUsingGraphConfiguration() を確認してください。
フレームレートの混同: SetFrameRange はディスプレイレートのフレームを使いますが、UMovieSceneSubSection のオフセットと UMovieScene::GetPlaybackRange はティック解像度のフレームを使います。GetDisplayRate() と GetTickResolution() で変換してください。
カメラカットがレプリケートされると思い込む: カットはクライアントごとに評価されます。サーバーが再生時間を制御し、各クライアントがそれぞれのカットを適用するように、SetReplicatePlayback(true) または AReplicatedLevelSequenceActor を使ってください。
関連スキル
ue-animation-system— シーケンスのアニメーショントラックで再生するスケルタルアニメーションアセット、モンタージュ、アニメーション通知ue-gameplay-cameras— Sequencer 外でのゲームプレイカメラ、カメラモディファイア、カメラシェイク、ビュ一ターゲットのブレンドue-audio-system— シーケンスのオーディオトラックで使うサウンドアセット、サブミックス、減衰ue-niagara-effects— シネマティックでトリガーされる、またはシーケンスでキーが設定されるパーティクルシステムue-materials-rendering— レンダーパスでキャプチャされるポストプロセス、Lumen、マテリアルの設定ue-actor-component-architecture— シーケンスが所有権を持つアクターのスポーンと所有ue-world-level-streaming— カットシーン前のレベルのストリーミングと、レンダリング中の Data Layer の状態