Sequencer 構造解説とカスタムトラック追加 (UE4.18版) – 構造解説編

Unreal Engine 4 (UE4) Advent Calendar 2017 - Qiita
今年もやります、UE4アドベントカレンダー!Unreal Engine 4 (UE4)に関する知見をみんなで毎日シェアしていきましょう! 即埋まったので、その2も作っちゃいました! 過去のアドベントカレンダー 2016年:

この記事は Unreal Engine 4 (UE4) Advent Calendar 2017 の 17 日目の記事です。

自分でカスタムしたトラックを Sequencer に追加する方法に関して書きます。基本的に C++er 向けの内容になります。
トラックを追加するといっても、ある程度 Sequencer の内部構造に関して理解がないと作ることが難しいため、
以下のような 3 部構成とします。


構造解説編では、Sequencer について、カスタムトラックを作る上で事前に把握しておくべき基本的な事柄を順に解説していく。

Sequencer の種類

Sequencer とは、レベル内に配置されたアクターのタイムラインを編集してシーンカットを作ることができるツール。

シーケンサー エディタ
シーケンサーは UE4 のマルチ トラック エディタです。シネマティックス シーケンスをリアルタイムで作成し、プレビューするために使用します。

が、UE4 のプログラム上で厳密に言うと Sequencer モジュール自体はタイムラインツールそのもの であり、上記の機能は Sequencer モジュール機能を利用した一種 という扱い。
ソースコードを読む際は注意したい。

現状、Sequencer には、以下のような種類が存在する。

Level Sequence

  • レベル内のタイムラインを編集する。シーンカットを作るためのツール。
  • よく UE4 で「シーケンサー」というときは、だいたいコレのことを指す。

Widget Animation

  • Widget(UMG) のアニメーションを制御するツール。
  • Widget Blueprint を開いたときに下部に存在するタイムラインツールがそれ。

Actor Sequence

  • UE4.15 から追加された、アクター内で Level Sequence と同じようにタイムライン編集ができるツール。
  • Experimental 扱いなため、プラグインを有効化しないと使えない。

Niagara Sequence

  • 新しいパーティクルエディタである Niagara 用のツール。
  • こちらもプラグインがデフォルトで false なので有効化しないと使えない。
  • Niagara 自体はまだ発展途上であり、Niagara Sequence が具体的にどう活用されるのかは謎。
UMovieSceneSequence が抽象クラスとなっており、それぞれ上記の名前の継承クラスが存在する。

トラックとセクション

シーケンサーはトラックセクションという単位で構成されている。

黄色の実線で囲んだ領域がトラック、赤い破線で囲んだ領域がセクション。

基本的に、トラックがセクションを包括する関係。セクションは複数存在可能で、1 トラック内で複数行使用した表示もできる。

例えば、Audio Track や Level Visibility Track は、複数のセクションを置くことを前提とした作りになっていたり、
Event Track のように 1 つだけセクションがおいてあり、その中でキーフレームを打てるパターンも存在する。

Sequencer で使用されるモジュール

Sequencer は、いつかのモジュールに分割されている。
エディタ拡張でトラックをカスタムする場合、以下の 4 つのモジュールをメインで使用することになる。

Runtime 側

MovieScene モジュール
  • Runtime 時に動作するトラック・セクションの基底クラスの定義。
  • Runtime 時にのみ必要な機能や、情報はこちらで定義されたクラスが使われている。
MovieSceneTracks モジュール
  • UE4 標準で実装されている各トラックの Runtime クラス定義。
  • MovieScene で定義されているクラスを継承したクラスが置かれている。
  • Runtime 側の具体的な実装例が書かれているため、トラックを独自実装する際にかなり参考になる。
  • 実装したい内容次第だが、ここのクラスをそのまま使ってカスタムトラックを作ると楽に実装できる場合が多い。

Editor 側

Sequencer モジュール
  • Editor 時にのみ動作する Sequencer 関連のクラス定義。
  • 各トラック用の Editor 時のみ動作する基底クラスの定義。
  • エディタから見える範囲の挙動(トラック表示名やメニュー、セクションのカラーなど)はこちらのクラスが担当する。
  • 基本的にはここのクラスを継承し、必要に応じて関数を override することで、様々な部分のメニューを設定することが可能になっている。
MovieSceneTools モジュール
  • UE4 標準で実装されている各トラック用の Editor クラス定義
  • Sequencer モジュールで定義されているクラスを継承したクラスが置かれている。
  • Editor 側の具体的な実装例が書かれているため、こちらもトラックを独自実装する際にかなり参考になる。
上記の他にも、シーケンスレコーダーが実装されている SequenceRecorder モジュール、旧ツール Matinne から Sequencer に移行するための MatineeToLevelSequence モジュールなどのいくつかの関連モジュールがある。
そちらの方までは、正直なところ、全く調査できていないし、あまり今回の目的には直接関係がないので今回は省略する。

トラックの種類

トラックは大きく分けて 2 種類に分類できる。

プロパティトラック

プロパティに対して紐づけられるトラック。
基本的に単一セクション内でタイムラインに沿ってキーフレームを打ちプロパティの変化を設定できるような形になっている。

プロパティトラックには、そのベースとなるクラスが用意されており、それを継承することで比較的楽に実装できるようになっている。
一部には、BoolProperty を継承して、HiddenInGame を操作するような VisibilityProperty など、特殊なものも存在する。
UE4.18 時点では、以下のプロパティに関してプロパティトラックがデフォルトで登録されている。

MovieSceneTracks, MovieSceneTools モジュールで定義

  • BoolProperty
  • ByteProperty (uint8,Enum)
  • FloatProperty
  • ColorProperty (FColor, FLinearColor, FSlateColor)
  • IntegerProperty
  • VectorProperty
  • TransformProperty
  • VisibilityProperty (AActor::SetActorHiddenInGame, USceneComponent::SetHiddenInGame の操作)
  • ActorReferenceProperty (FGuid)
  • StringProperty

それ以外のモジュールで個別に定義

  • Margin (主に Widget Animation で使われる)
  • 2DTransform (FWidgetTransform、主に Widget Animation で使われる)
  • Media (MediaCompositing モジュール用)
  • ComposurePostMoveSettingsProperty (Composure モジュール用)
  • ImagePlate (ImagePlate モジュール用)

それ以外のトラック

AudioTrack や EventTrack などのプロパティに直接紐付かないトラックは、それぞれ独自の実装が行われている場合が多い。
セクションを複数置けるトラックや、PropertyTrack を直接継承はしていないもののキーフレームを打てるようになっているトラックなどもある。

MovieSceneTracks, MovieSceneTools モジュールで定義

  • SkeletalAnimation
  • 3DAttach
  • Audio
  • Particle
  • ParticleParameter
  • 3DPath
  • CameraCut
  • CinematicShot
  • Slomo (Play Rate)
  • SubTrack
  • 3DTransform
  • ComponentMaterial
  • Fade
  • Spawn
  • LevelVisibility
  • CameraAnim
  • CameraShake
  • MaterialParameterCollection

それ以外のモジュールで個別に定義

  • WidgetMaterial (主に Widget Animation で使われる)
  • NiagaraEmitter (Niagara モジュール用)
  • ControlRig (ControlRig モジュール用)
  • ControlRigBinding (ControlRig モジュール用)

Object Binding と Master Track

トラックには、上記の分類の他に、オブジェクトに紐付いているかどうか という観点でも分類することができる。

アクターを選択してから、そのアクターのプロパティや機能に対してバインドされる形で追加されるトラック。
Sequencer ではこの紐づけを Object Binding といい、ソースコード上でも頻繁にこの表記を見かける。
オブジェクトは基本的に FGuid で管理されており、引数に FGuid がある関数は、だいたいは Object Binding 絡みの機能になっている。

それに対し、「オブジェクトに紐付かないトラック」も存在する。
例えば、Audio Track や Event Track などは「+Track」ボタンから直接選択して Sequencer トップに追加することができる。
これらのトラックは Master Track と区別して呼ばれている。


解説は以上。
カスタムトラックに関しては続きへ ↓

Sequencer 構造解説とカスタムトラック追加 (UE4.18版) - カスタムトラック編
この記事は Unreal Engine 4 (UE4) Advent Calendar 2017 の 17 日目の記事です。 自分でカ...