テラシュールさんで追記予定と書かれて放置されている○○BehaviourでTrackのオブジェクトを取得する方法を見つけたので、知見を共有します。
お世話になったサイト
テラシュールブログ: 【Unity】TimelineでOnBehaviourPlayのタイミングでTrackの情報を使って初期化したい
LIGHT11: 【Unity】【Timeline】ブレンドも可能なカスタムクリップを持つカスタムトラックの作り方
環境 unity2018.3.6
方法
やり方としては、○○MixerBehaviourのOnGraphStartで、Trackにバインドしたオブジェクトを取得と同時にfor文で全clipに取得したオブジェクトを渡します。あとは○○BehaviourのOnBehaviourPlayで初期化なり、値を取得するなりできるという算段です。
ソースコード
ここではTrackにバインドしたGameObjectを取得する例をあげます。
TestBehaviour.cs
usingUnityEngine;usingUnityEngine.Playables;usingUnityEngine.Timeline;[Serializable]publicclassTestBehaviour:PlayableBehaviour{publicGameObjecttrackObj;// 各clip開始時に呼び出されるpublicoverridevoidOnBehaviourPlay(Playableplayable,FrameDatainfo){if(!trackObj)return;// なんらかの処理}}
TestClip.cs
usingSystem;usingUnityEngine;usingUnityEngine.Playables;usingUnityEngine.Timeline;[Serializable]publicclassTestClip:PlayableAsset,ITimelineClipAsset{publicTestBehaviourtemplate=newTestBehaviour();publicoverridePlayableCreatePlayable(PlayableGraphgraph,GameObjectowner){// TestBehaviourを作成varplayable=ScriptPlayable<TestBehaviour>.Create(graph,template);returnplayable;}}
TestMixerBehaviour.cs
usingSystem;usingUnityEngine;usingUnityEngine.Playables;usingUnityEngine.Timeline;publicclassTestMixerBehaviour:PlayableBehaviour{// トラックに入っているGameObjectpublicGameObjectm_TrackBinding;// timelineの開始時 初期化publicoverridevoidOnGraphStart(Playableplayable){if(!m_TrackBinding)return;// Trackの全clipの数を取得 intinputCount=playable.GetInputCount();for(inti=0;i<inputCount;i++){// 各clipのbehaviour取得ScriptPlayable<TestBehaviour>inputPlayable=(ScriptPlayable<TestBehaviour>)playable.GetInput(i);TestBehaviourinput=inputPlayable.GetBehaviour();// trackのGameObjectを渡すinput.trackObj=m_TrackBinding;}}}
TestTrack.cs
usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.Playables;usingUnityEngine.Timeline;[TrackClipType(typeof(TestClip))][TrackBindingType(typeof(GameObject))]publicclassTestTrack:TrackAsset{publicoverridePlayableCreateTrackMixer(PlayableGraphgraph,GameObjectgo,intinputCount){// TestMixerBehaviourを作成varplayable=ScriptPlayable<TestMixerBehaviour>.Create(graph,inputCount);vartrackBinding=go.GetComponent<PlayableDirector>().GetGenericBinding(this)asGameObject;// TrackにバインドされたGameObjectをTestMixerBehaviourに渡すplayable.GetBehaviour().m_TrackBinding=trackBinding;returnplayable;}}
以上のようなコードで、Timelineの再生ボタンを押した時にTestMixerBehaviour.csのfor文が走り、全部のclipにバインドされたGameObjectが参照され、各clipの開始時にいろいろ処理ができるというコードができました。
ほかにもっとスマートな方法がありましたら、教えていただけると助かります。