みんな大好きDOTween。私も毎日使ってます。
長らく使っていると落とし穴にもハマることもありまして、、、
こちらのコードは一見普通のループアニメーションのDOTweenです。
var tween = transform.DOLocalMoveX(1f, 2f) .SetEase(Ease.Linear) .SetLoops(-1, LoopType.Yoyo) .OnComplete(()=>Debug.Log(“Complete”));
今いる座標と x : 1 の間を2秒かけた平行移動をループし続けます。
※SetLoopsの第1引数に -1 を代入すると永久に繰り返されます
今回は 永久ループ
(SetLoops第1引数に「-1」をセットした場合) に起こる罠について紹介します。
3種類のTween停止方法
永久ループ設定していないTweenの停止方法のおさらいします。
- 自然停止(SetLoopsに0未満の整数が代入されていない場合)
- Pauseメソッド & TogglePauseメソッド
- Killメソッド
- Completeメソッド
自然停止
言わずもがななので割愛。
Pauseメソッド & TogglePauseメソッド
tween.Pause(); // or tween.TogglePause();
その名の通り 一時停止 です。一時停止ということは、Playメソッド
or TogglePauseメソッド
で、ポーズしたその状態から再開することはが出来ます。もう1つ Restartメソッド
もありまして、こちらはTweenの最初から再度実行したいときに使用します。
Killメソッド
tween.Kill();
Pauseメソッドと異なり、再度そのTweenを実行出来ません。
Killを実行したそのタイミングでの状態
で停止します。
無引数で実行すると OnComplete
が呼ばれませんが、 true
を代入するとOnCompleteが実行されてTweenは停止します。
Completeメソッド
tween.Complete();
こちらもKillと同様再度そのTweenを実行出来ない状態で停止しますが、Killとの違いは、Tweenのゴール地点まで一気にジャンプ
します。冒頭の例だとtransform.localPosition.xは1f
になります。
永久ループTweenの停止方法
永久ループ設定 (SetLoops第1引数に-1をセット) の場合、停止方法の幾つかは使用できなくなります。
表にして見ました。
停止手段 | 停止可能 | 備考 |
---|---|---|
自然停止 | 不可 | 永久ループなので停止しない |
Pause & TogglePause | 可能 | - |
Kill | 可能 | - |
Complete | 不可 | Complete状態が存在しないため |
Pause & TogglePauseまたはKillのみ停止させることが可能です。
まとめ
永久ループ設定した場合のDOTween挙動について紹介してきました。
「SetLoopsを-1にセットしたときは、Completeという概念が無くなる」
ということです。
冒頭のソースコード内 OnComplete
関数はセットしたとしても実行される術が無いため、定義してはいけないということになります。
var tween = transform.DOLocalMoveX(1f, 2f) .SetEase(Ease.Linear) .SetLoops(-1, LoopType.Yoyo) // SetLoops第1引数が-1なので、OnCompleteは実行されません!! .OnComplete(()=>Debug.Log(“Complete”));
開発中、なぜかOnCompleteが実行されないな、と疑問に思った方はSetLoopsを今一度確認してみてはいかがでしょうか。