Unityのタイムライン上で、各トラック内のクリップが持つパラメーターを、スクリプトから動的に変更する手順まとめです。
処理内容を箇条書きにすると
①タイムライン内のトラック一覧から、指定名称のトラックを取得
②トラック内のクリップ一覧から、指定名称のクリップを取得
③クリップのパラメーターを変更
の順番にやっていきます。
今回はUnity公式がAssetStoreで配布している「Default Playables」に含まれている
「Transform Tween Track」のクリップを書き換えてみます。
「Transform Tween Track」はクリップに指定されている Start Location から End Location まで移動するだけのシンプルなトラックです。
これの End Location を実行時に動的に書き換えて移動先を変更しようと思います。
まず、
①タイムライン内のトラックから、指定名称のトラックを取得
します。
次に、
②トラック内のクリップ一覧から、指定名称のクリップを取得
します。
最後に、
③クリップのパラメーターを変更
します。
実際に使う場合、上記の処理を整理した以下のようなコンポーネントをPlayableDirectorのGameObjectに付与します。
※頻繁に使う場合は tracks や clips はキャッシュしたほうが良いと思います。
そして、下のような呼び出しでパラメーターを変更します。
参考
処理内容を箇条書きにすると
①タイムライン内のトラック一覧から、指定名称のトラックを取得
②トラック内のクリップ一覧から、指定名称のクリップを取得
③クリップのパラメーターを変更
の順番にやっていきます。
今回はUnity公式がAssetStoreで配布している「Default Playables」に含まれている
「Transform Tween Track」のクリップを書き換えてみます。
「Transform Tween Track」はクリップに指定されている Start Location から End Location まで移動するだけのシンプルなトラックです。
これの End Location を実行時に動的に書き換えて移動先を変更しようと思います。
まず、
①タイムライン内のトラックから、指定名称のトラックを取得
します。
// タイムライン内のトラック一覧を取得 IEnumerable<TrackAsset> tracks = (m_director.playableAsset as TimelineAsset).GetOutputTracks(); // 指定名称のトラックを抜き出す TrackAsset track = tracks.FirstOrDefault(x => x.name == "TransformTweenTrack01");ここで指定するトラック名は、Timelineウィンドウでトラックを選択中にInspectorウィンドウで設定できます。
次に、
②トラック内のクリップ一覧から、指定名称のクリップを取得
します。
// トラック内のクリップ一覧を取得 IEnumerable<TimelineClip> clips = track.GetClips(); // 指定名称のクリップを抜き出す TimelineClip clip = clips.FirstOrDefault(x => x.displayName == "TransformTweenClip01");ここで指定するクリップ名は、Timelineウィンドウでトラック内のクリップを選択中にInspectorウィンドウで設定できます。
最後に、
③クリップのパラメーターを変更
します。
// クリップのPlayableAssetを対応する型へキャスト var transTweenClip = clip.asset as TransformTweenClip; // End Location の値を変更 transTweenClip.endLocation.exposedName = System.Guid.NewGuid().ToString(); m_director.SetReferenceValue(transTweenClip.endLocation.exposedName, newEndLocation);exposedNameに渡す値は何でも良いのですが、ユニークなキーが必要なので、ここではGUIDを使っています。
実際に使う場合、上記の処理を整理した以下のようなコンポーネントをPlayableDirectorのGameObjectに付与します。
※頻繁に使う場合は tracks や clips はキャッシュしたほうが良いと思います。
そして、下のような呼び出しでパラメーターを変更します。
[SerializeField] private PlayableDirector m_director; [SerializeField] private TimelineParamSetter m_timelineParamSetter; [SerializeField] private Transform m_newEndLocation; public void OnBtnChangeClicked() { // 再生停止 m_director.Stop(); // End Locationを変更 m_timelineParamSetter.SetTransformTweenEndLocation("TransformTweenTrack01", "TransformTweenClip01", m_newEndLocation); // 再生開始 m_director.Play(); }※タイムライン再生中は変更が適用されないので、再生している場合は事前に停止する必要があります。
参考