はじめてのScriptPlayable

おひさしです。ちょびえです。今回もUnityのお話でPlayableGraphのScriptPlayableについて書いてみようと思います。

本当はUnity2017で入ったTimelineの話を書きたいんですが、Timelineを細かく調整するにあたってPlayableGraph, ScriptPlayableは避けても通れない機能です。

ScriptPlayableは機能単体でみるととても地味なのですが、わからないまま使うと結構危ういところもあり、マニュアルやサンプルも少なめなのでScriptPlayableを使ったPlayableGraphを単体で実行できる所までを書いてみようと思います。めっちゃ地味なんですがTimeline関連の自前で作る人にはいろいろ参考になるかと。

ScriptPlayableとは

Unity2017.1のScript Referenceを見てみると…

はい。よくわからないですね。dllの中身を確認するとScriptPlayableは

ということなので、ScriptPlayableはPlayableBehaviourのガワ、と思ってもらえればOKかと。
PlayableAPIがNativeで作成されている関係上こうなっているのだと思います。
ScriptPlayableを使うことでユーザー定義の振る舞いを定義できる機能でTimelineなどを扱う場合はきちんと把握しておくべき機能となります。

PlayableBehaviourはIPlayableBehaviour, ICloneableを実装するクラスで下記メソッドが期待されます。

◆開始/終了
OnGraphStart グラフの再生時に呼ばれる
OnGraphStop グラフの停止時に呼ばれる

◆生成/破棄
OnPlayableCreate 生成時のコールバック
OnPlayableDestroy 破棄時のコールバック

◆実行時
OnBehaviourPause Playableの状態がポーズになったら呼ばれる
OnBehaviourPlay Playableの状態がPlayになったら呼ばれる

PrepareFrame ProcessFrameより前にPlay状態のNode全体で再帰的に呼ばれる
ProcessFrame PrepareFrameより後にPlay状態のNode全体で再帰的に呼ばれる

という感じです。

ScriptPlayableのPlayableGraphを作る(1Playableのみ)

細かい話はおいといて、さくっとScriptPlayableだけのPlayableGraphを作ってみます。

まずはSampleBehaviour.csを作成します。

つぎにテスト用のコードを作ります。まずは一つのPlayableだけを持つPlayableGraphを作ります

SamplePlayable.cs

ScriptPlayableOutputは2017の現状だとScriptPlayableを持つOutputという目印です。

適当なGameObjectにSamplePlayableをAdd Componentして再生してみるとこんなログがでます。


1Playableだけだとあんまりおもしろくないですが、こんなもんです。

ScriptPlayableのPlayableGraphを作る(親子)

続いて親子関係を持ったPlayableを作ってみます。

 親
子 子

というかんじのグラフです。

SamplePlayable2.cs

こんな感じ。すべてのPlayableが実行されています。

SetTime, SetDurationをつかってみる

IPlayableを実装した項目はPlayableExtensionsの拡張メソッドが使えます。

SamplePlayable3.cs

きっとこれで実行するといい感じに指定時間、長さでやってくれるんだろうな、と思いますがそんなことはなく。
Time,Durationはあくまで参考情報なので自前で制御する必要があります。

SampleBehaviourのPrepareFrameを改変します。とりあえず動けばいいので適当です。

これで親子でTimeとDurationを参照したものが期待した通り動きます。

まとめると

PlayableBehaviourはマイクロな振る舞いを定義してPlayableGraphで親子関係などが作れます。

子PlayableのBlendingやTimelineのような管理などを行う場合はMixerPlayableなどの子をラップするPlayableを作成して自前でブレンドのウェイトの計算や、Play/Pauseの管理を行っていくことで任意の挙動を作ることができます。

PlayableGraphの利点としては、きちんとPlayableAssetのScriptableObjectを作ってさえいればPlayableDirectorに渡してあげるだけでどんな振る舞いもさせられるというところです。逆に言うと細かい制御とかは難しくなると思いますが、ケースバイケースということで。

また後日Timeline関連についても時間があれば書こうと思いますが、ちょっとだけ書いておくとTimelineの中身としては大体PlayableでTrack、個別Mixer、個別Playableがそれぞれ自前のやるべきことやっていい感じに動かしている、と認識しておくとよいです。
(Mixer関係のBlendingはわりと重要なので先に抑えておかないと増えた後に直すのはとても面倒です)

簡易的にPlayableBehaviourを追加する場合はPlayableTrackに突っ込むケースが多いかと思いますが、これだと書くコード事態は少ないけど個別バインドをしないといけなくなってしまいます。

個人的なお勧めはTrackAsset,MixerBehaviour, PlayableBeahviour, PlayableAsset4種をきちんと作りきってやっていくのが良いかと思います。

ここらへんはDefault Playables を読むのが一番確実なので参考にするとよいです。

補足

PlayableBehaviourでInputを取得した際にどうやってPlayableBehaviourにアクセスするかというと
こんな感じで、キャストしてGetBeavhiour()をコールすればアクセスできます。

ダイナミックにバインディングを変える場合や細かい操作をする場合は必須になるので覚えておくとよいです。