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 とか使ってあげるとうまくいくかも。
もしくはこちらの記事参照。

“Timelineのバインドを解除” への1件のコメント

  1. […] ているので、毎フレームエミットしようとしては消えてを繰り返しておかしくなる… 以前の記事みたいにバインドを外せば直るはず。もしくは、WrapMode を None にしてあげても問題ない […]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です