【Unity】Timelineからメソッドを呼ぶ新機能 「Marker」と「Signal、Signal Receiver」
今回はTimelineから特定のメソッドを呼ぶ方法について紹介します。
Unity 2019.1.0a10で追加された、Timelineでメソッドを呼び出すSignalTrackの使い方 #unitytips pic.twitter.com/BEPvS1D6Qb
— 椿 (@tsubaki_t1) 2018年11月29日
この機能はUnity 2019.1 a11から安定して使用出来ます。
これはベータですらないアルファの機能なので、今後変化する可能性があります。
Timelineからメソッドを呼ぶ仕組み
Timelineではアニメーションイベントと区別するためか、「Signal」という新しい概念を追加しました。
Signalはアセットです。これはScene上のSignal ReceiverとTimelineに登録します。TimelineからSignalを呼び出すと、シーン上に存在するSignal Receiverがシグナルを受信し、Signal ReceiverがUnity Eventを呼び出す流れです。

| 名称 | 機能 |
|---|---|
| Signal | アセット、マーカーに登録する |
| Marker | Timelineに登録するイベント |
| Signal Receiver | マーカーからシグナルを識別して、UnityEventを呼び出す |
SignalやSignal Receiver、マーカーを使う流れ
使い方を見てみます。今回は下のような、特定のタイミングでパーティクルを出力してみます。*1

まず最初に、Signalアセットを作ります。
名前は何でも良いのですが、全体を通してユニークな名称である必要があるので、Signalフォルダとか作って、全てソコに突っ込むのが良さそうです。
今回はEmitというSignalを作りました。

次にシグナルで反応して欲しいGameObjectにSignal Receiverを登録します。
今回は、移動する玉(Sphere)オブジェクトのParticle System.Emit(100)を呼び出してみます。
Timelineのシグナルと関連付ける為、Signalには先程作成したシグナル、Emitを登録します

あとはTimelineのアニメーションクリップ上でAdd Signal Emitterを選択し、マーカーを追加します。
マーカーのシグナルはEmitを選択すると、そのタイミングに呼ばれるイベントが何かを確認出来ます。

Tips
呼び出されるマーカーは、Trackが指定しているオブジェクトのSignal Receiverです。同じSignalを使用している場合でも、異なるSignal Receiverの場合、各々のイベントが呼ばれます。
呼び出すSignal ReceiverはTimelineのTrack指定ですが、その他にもSignal Receiver自体をTrackに登録するSignal Receiver Trackや、Playabel Directorが登録されているオブジェクトに設定されているSignal Receiverを呼び出す、Marker Trackなどがあります。

Signal ReceiverのUnityEventをEditor And Runtimeにすると、動かせるAPIならゲームを再生しなくてもイベントを呼び出す事が出来ます。その場合、当然巻き戻し処理を作っておかないとひどい目になります。

マーカーの挙動を自作する
マーカーを自作することも出来ます。
こちらの方は、Signal等を用意せずともよく、コードベースで色々な処理を実装可能です。
特にSignalベースだと、マーカーに複数の情報を登録する場合*2にSignalが増えすぎて不便なので、場合によってはコチラの方が便利かもしれません。
今回はTimelineから文字を切り替える処理を作成してみます。
マーカーに到着したタイミングで文字を切り替えています。

自作するコードには、送信するマーカーと、マーカーを受信するコンポーネントが必要です。
Text Marker ReceiverはSignal Receiverの代わりに登録します。Timelineからこのクラスが呼ばれる感じです。

次にマーカーを受信するGameObjectを登録するTrackを追加します。Animation等で動かしているなら該当するTrackに足せば良いですが、特に無いのならばMarker Trackが良いです。
あとはMarker Trackにイベントを登録します。上のコードを登録しておくと、登録するマーカー一覧にテキストのマーカーが追加されているので、登録します。あとはマーカーの中身をInspectorで設定していきます。


これでゲームを再生するとイベントが呼ばれます。今回の場合は、テキストの中身が差し替わります。
感想
Signalが直感的ではない感じがしましたが、複数のTimelineを複数のSceneで使いまわしたり、イベントを沢山配置する用途だと確かに理にかなっている気がします。
関連
Signalについて
New in 2019.1 - Timeline Signals - Unity Forum
マーカーのカスタマイズ
New in 2019.1 - Marker Customization - Unity Forum
AnimationEventのように、特定のメソッドを呼び出す、カスタムマーカーのサンプル
Unity 2019.1未満ならコチラ
わかりやすいスライドが公開されました