mcpField
U
ue-sequencer-cinematics

ue-sequencer-cinematics

github.com/quodsolerクリエイティブ・メディア4191.1k 回インストール4 週間前に更新
リポジトリ

ue-sequencer-cinematics について

Unreal Engine 5.8 開発者向けの Sequencer とシネマティクスのスキルです。5.8 のヘッダーで確認された API をもとに、再生、バインディング、イベントトラック、カメラ、レンダリングを案内します。

主な機能

  1. 01Sequencer モジュール依存関係の案内
  2. 02ランタイム再生とバインディング
  3. 03イベントトラックの呼び出し規則
  4. 04MovieScene データモデルの解説
  5. 05シネマカメラとレンダリングの案内

活用シーン

  1. 01ゲーム内カットシーンの再生実装
  2. 02シーケンスとランタイム Actor のバインド
  3. 03タイムラインイベントからの C++ 呼び出し
  4. 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ビューポートで使用するカメラ
UMovieSceneEventTrackDirector 関数の呼び出し
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 emitUse in 5.8Source
SeqActor->SequencePlayerSeqActor->GetSequencePlayer()UE_DEPRECATED(5.4) in LevelSequenceActor.h:86
SeqActor->bAutoPlaySeqActor->PlaybackSettings.bAutoPlaybAutoPlay_DEPRECATED in LevelSequenceActor.h:109
non-const MovieScene->GetBindings()const GetBindings()UE_DEPRECATED(5.7) in MovieScene.h:782
FMovieSceneBinding::GetName / SetNameFMovieScenePossessable::GetName, FMovieSceneSpawnable::GetNameUE_DEPRECATED(5.7) in MovieSceneBinding.h:89
MovieScene->GetSoloNodes() / GetMuteNodes()FindDecorationUE_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
GameModeOverrideSoftGameModeOverrideUE_DEPRECATED(5.5) in MoviePipelineGameOverrideSetting.h:77
RendererName memberGetRendererName()UE_DEPRECATED(5.7) in Graph/Nodes/MovieGraphBurnInNode.h:43
Section->Parameters.TimeScale = 1.0Parameters.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 の状態

コメント