Timelineのバインドを解除
タイムラインで WrapMode を Hold にした際に、その後 Animator でアニメーションが制御できなくなってしまう。例えばオープニングアニメーションのあとにスタートボタンだけボタンを押されたときに Animator でボタンのアニメを再生させたいとかそんな場合、ボタンを包む GameObject でコンテナを作って、Timeline ではそっちを制御するなんかの工夫が必要になってくる。
Timeline を流した後、別の Timeline を流す分には問題なくアニメーションが流れるけど、Animator での制御が効かない。
こんな感じでスクリプトから Timeline のトラックに紐づいているオブジェクトをなくしてあげると、Timeline のアニメーションは動かなり、 Animator での制御ができるようになった。
同じような処理で、再度バインドし直してあげたり、別のオブジェクトをバインドすることも可能。
スクリプトで動かしてあげたい場合にはそもそも Animator の方をオフにしてあげないといけない。
using System.Collections.Generic; using UnityEngine; using UnityEngine.Playables; using UnityEngine.Timeline; using UnityEngine.UI; public class ClearTimelineBindings : MonoBehaviour { [SerializeField] private PlayableDirector timeline01; [SerializeField] private PlayableDirector timeline02; [SerializeField] private Transform imageTrans; [SerializeField] private Text animationEnableTxt; [SerializeField] private GameObject bindGO; private Animator animator; private void Start() { this.animator = this.imageTrans.GetComponent<Animator>(); } public void PlayTimeline01() { this.timeline01.time = 0f; this.timeline01.Play(); } public void PlayTimeline02() { this.timeline02.time = 0f; this.timeline02.Play(); } public void SetTriggerAnimator01() { this.animator.SetTrigger("Animation01"); } public void SetTriggerAnimator02() { this.animator.SetTrigger("Animation02"); } public void SwitchAnimator() { this.animator.enabled = !this.animator.enabled; this.animationEnableTxt.text = "Animator\n" + (this.animator.enabled ? "ON" : "OFF"); } public void ScaleByScript() { this.imageTrans.localScale *= 1.1f; } public void ClearBinds() { this.BindToTimelines(null); } public void BindGameObject() { this.BindToTimelines(this.bindGO); } public void BindToTimelines(GameObject go) { foreach (PlayableDirector timeline in new []{this.timeline01, this.timeline02}) { IEnumerable<TrackAsset> tracks = (timeline.playableAsset as TimelineAsset).GetOutputTracks(); foreach (TrackAsset track in tracks) { timeline.SetGenericBinding(track, go); } } } }
特定の名前のトラックだけオフにしたいのであれば
(timeline.playableAsset as TimelineAsset) .GetOutputTracks() .First(t => t.name == "****");
こんな感じで名前で取れる。
本当はアニメーション(制御)しているオブジェクトを取りたかったんだけどそれは取れない??
ちなみにトラック名の設定は
トラックを選択したインスペクターから。
追記) 2019.04.01
Activation Trackでは解除してもうまく動作しないことがあった…
状況にもよるけどControl Track とか使ってあげるとうまくいくかも。
もしくはこちらの記事参照。
[…] ているので、毎フレームエミットしようとしては消えてを繰り返しておかしくなる… 以前の記事みたいにバインドを外せば直るはず。もしくは、WrapMode を None にしてあげても問題ない […]