DoTweenのOnComplete()が呼ばれなくて困った話
久しぶりにDoTweenを使っていてしょうもないことでハマったので、反省の意味を込めてメモしておきます。 アニメーションが再生中であるかどうかを判定するために、再生中のSequenceをメンバー変数に持たせればいいかと思い以下のように書いていました。
using Assets.Scripts.SGUI.SGameObjects.ComponentScripts; using DG.Tweening; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class App : MonoBehaviour { [SerializeField] private GameObject obj; [SerializeField] private Button button; public Sequence sequence; void Start() { sequence = DOTween.Sequence(); button.onClick.AddListener(() => { Animate(); }); } public void Animate() { Debug.Log("STARTED"); if (sequence.IsPlaying()) { sequence.Complete(); } else sequence.Append(obj.transform.DOShakePosition(10f, 100, 100)) .OnComplete(() => { Debug.Log("COMPLETED"); }); } }
が、これはうまくいきません。sequence.IsPlaying()
は呼ばれないし OnComplete()
も呼ばれません。
理由は単純に自分が勘違いしてただけなのですが、Sequenceはインスタンスを生成して使いまわすものではなく、アニメーションを再生するたびに
DOTween.Sequence()
で生成するものだからみたいです。なので正しくはこうです。
public void Animate() { Debug.Log("STARTED"); if (sequence.IsPlaying()) { sequence.Complete(); } else sequence = DOTween.Sequence().Append(obj.transform.DOShakePosition(10f, 100, 100)) .OnComplete(() => { Debug.Log("COMPLETED"); }); }
Append()の意味を考えると当然なのですが、なまじOnComplete以外のアニメーションは動くのでしばらくハマりました‥‥
一度ちゃんとドキュメント読んでおこうと思いました。