テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】Timelineからメソッドを呼ぶ新機能 「Marker」と「Signal、Signal Receiver」

今回はTimelineから特定のメソッドを呼ぶ方法について紹介します。

この機能はUnity 2019.1 a11から安定して使用出来ます。
これはベータですらないアルファの機能なので、今後変化する可能性があります。

Timelineからメソッドを呼ぶ仕組み

Timelineではアニメーションイベントと区別するためか、「Signal」という新しい概念を追加しました。

Signalはアセットです。これはScene上のSignal ReceiverとTimelineに登録します。TimelineからSignalを呼び出すと、シーン上に存在するSignal Receiverシグナルを受信し、Signal ReceiverがUnity Eventを呼び出す流れです。

f:id:tsubaki_t1:20181210222329j:plain

名称 機能
Signal アセット、マーカーに登録する
Marker Timelineに登録するイベント
Signal Receiver マーカーからシグナルを識別して、UnityEventを呼び出す

SignalやSignal Receiver、マーカーを使う流れ

使い方を見てみます。今回は下のような、特定のタイミングでパーティクルを出力してみます。*1

f:id:tsubaki_t1:20181210224251g:plain

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

今回はEmitというSignalを作りました。

f:id:tsubaki_t1:20181210223748j:plain

次にシグナルで反応して欲しいGameObjectにSignal Receiverを登録します。

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

f:id:tsubaki_t1:20181210224057j:plain

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

f:id:tsubaki_t1:20181210224710j:plain

Tips

呼び出されるマーカーは、Trackが指定しているオブジェクトのSignal Receiverです。同じSignalを使用している場合でも、異なるSignal Receiverの場合、各々のイベントが呼ばれます。

呼び出すSignal ReceiverはTimelineのTrack指定ですが、その他にもSignal Receiver自体をTrackに登録するSignal Receiver Trackや、Playabel Directorが登録されているオブジェクトに設定されているSignal Receiverを呼び出す、Marker Trackなどがあります。

f:id:tsubaki_t1:20181210225200j:plain

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

f:id:tsubaki_t1:20181210230157j:plain

マーカーの挙動を自作する

マーカーを自作することも出来ます。
こちらの方は、Signal等を用意せずともよく、コードベースで色々な処理を実装可能です。 特にSignalベースだと、マーカーに複数の情報を登録する場合*2Signalが増えすぎて不便なので、場合によってはコチラの方が便利かもしれません。

今回はTimelineから文字を切り替える処理を作成してみます。
マーカーに到着したタイミングで文字を切り替えています。

f:id:tsubaki_t1:20181210230613g:plain

自作するコードには、送信するマーカーと、マーカーを受信するコンポーネントが必要です。

gist.github.com

Text Marker ReceiverSignal Receiverの代わりに登録します。Timelineからこのクラスが呼ばれる感じです。

f:id:tsubaki_t1:20181210232702j:plain

次にマーカーを受信するGameObjectを登録するTrackを追加します。Animation等で動かしているなら該当するTrackに足せば良いですが、特に無いのならばMarker Trackが良いです。

あとはMarker Trackにイベントを登録します。上のコードを登録しておくと、登録するマーカー一覧にテキストのマーカーが追加されているので、登録します。あとはマーカーの中身をInspectorで設定していきます。

f:id:tsubaki_t1:20181210231136j:plain

f:id:tsubaki_t1:20181210231312j:plain

これでゲームを再生するとイベントが呼ばれます。今回の場合は、テキストの中身が差し替わります。

感想

Signalが直感的ではない感じがしましたが、複数のTimelineを複数のSceneで使いまわしたり、イベントを沢山配置する用途だと確かに理にかなっている気がします。

関連

Signalについて

https://forum.unity.com/threads/new-in-2019-1-timeline-signals.594142/

マーカーのカスタマイズ

https://forum.unity.com/threads/new-in-2019-1-marker-customization.594712/

AnimationEventのように、特定のメソッドを呼び出す、カスタムマーカーのサンプル

github.com

Unity 2019.1未満ならコチラ

tsubakit1.hateblo.jp

*1:本当はCinemachineの画面揺らしをしたかったんですが、TimelineがPackageManagerに移ったせいで動作しません。

*2:例えば字幕のような、二度と使わないイベントを大量の登録する場合