こんにちは「DOTweenの教科書」執筆者のオオバです。
Unityのアニメーション開発を鬼効率化してくれるDOTween。オオバも毎日使っています。しかし長らく使っていると 落とし穴にもハマる こともありますよね。
そこで本記事ではループするDOTweenの落とし穴について共有します。アニメーションの永久ループは使う機会も多いです。ぜひこの記事をとおして DOTweenのループ落とし穴にはまらない ようにしましょう。
結論から話しますと 永久ループするDOTweenの止め方はKillメソッドのみ です。実は Completeメソッドで永久ループを止めることはできません。 また、永久ループ終了後にコールバック関数を呼びたい場合にも通常のトゥイーンと仕様が違います。この辺りどのように実装していけばよいか詳しく解説していきます。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
ループするDOTweenの作り方
まずはループするDOTweenの実装方法を紹介します。結論、SetLoopsメソッドを使います。
次のコードはTransformをX軸上で行ったり来たりするサンプルです。
💻ソースコード : Transformを永久ループさせるサンプル
transform.DOLocalMoveX(1f, 2f)
.SetLoops(-1, LoopType.Yoyo);
実行すると以下の動画のとおりX座標を行ったり来たりします。
DOTweenのSetLoopsの文法はこちら。
SetLoops(ループ回数, ループの種類);
「ループ回数」に1以上の数値を入れると、その回数だけループします。「-1」を代入すると永久ループするのです。
「ループの種類」は自著の電子書籍「DOTweenの教科書」 無料公開分の「🔰SetLoops - 繰り返し3種(ループ)」 で詳しく解説していますので参考にしてみてください。
📚 参考サイト : 🔰SetLoops - 繰り返し3種(ループ)|DOTweenの教科書
Transformを動かすのはDOTweenの基本。 こちらの記事ではDOTweenの基礎からでTransformを動かす方法までを分かりやすく解説しています。 DOTweenを始めたばかりの初心者におすすめ です。ぜひ読んでみてください。
DOTweenの止め方4選
永久ループ中のDOTweenを止める方法を紹介する前に、DOTweenを止める方法を復習します。 動作中のDOTweenを止める方法は4つあります。
①自然停止(何もしない)
②PauseメソッドまたはTogglePauseメソッド
③Killメソッド
④Completeメソッド
👉 【Unity】DOTweenをインストールする2種類の方法
止め方①自然停止(何もしない)
まずは「何もしない」という方法です。ループ回数が1以上の場合も含め自然に停止します。
止め方②PauseメソッドまたはTogglePauseメソッド
次にPauseメソッドです。動作中のDOTweenを一時停止させることができます。
以下はトゥイーン開始1秒後に一時停止させるサンプルコードです。
IEnumerator Start()
{
var tween = transform.DOLocalMoveX(1f, 2f);
// DOTween開始後1秒待機
yield return new WaitForSeconds(1f);
// DOTweenを一時停止
tween.Pause(); // or tween.TogglePause();
}
「Pause」その名の通り 一時停止 です。一時停止ということは Playメソッド または TogglePauseメソッド で再開させることができます。
💻ソースコード : Playメソッドで再開
tween.Play();
💻ソースコード : TogglePauseメソッドで再開
tween.TogglePause();
もう1つ Restartメソッド もあります。最初から再度実行したいときに使います。
💻ソースコード : Restartメソッドで最初から実行
tween.Restart();
止め方③Killメソッド
次は Killメソッド です。メソッド名のとおりDOTweenを殺します。Pauseメソッドと違うのは再度そのDOTweenを実行することができないことです。
IEnumerator Start()
{
var tween = transform.DOLocalMoveX(1f, 2f);
// DOTween開始後1秒待機
yield return new WaitForSeconds(1f);
// DOTweenを完全停止
tween.Kill();
}
Pauseメソッドと異なり、 再度そのTweenを実行できません。 Killを実行したタイミングで完全停止 します。
通常KillメソッドでOnCompleteは呼ばれない
Killメソッドを実行すると、DOTweenのコールバック関数OnCompleteは呼ばれません。
IEnumerator Start()
{
var tween = transform.DOLocalMoveX(1f, 2f)
.OnComplete(()=>Debug.Log("OnComplete実行"));
// DOTween開始後1秒待機
yield return new WaitForSeconds(1f);
tween.Kill(); // OnCompleteは呼ばれない
}
しかし、Killメソッドの引数にtrueを代入することでOnCompleteも呼ばれるようになるので覚えておきましょう。
tween.Kill(true);
↑DOTweenの完全停止と同時にOnCompleteが呼ばれるようになります。
止め方④Completeメソッド
DOTween最後の止め方「Completeメソッド」です。
IEnumerator Start()
{
var tween = transform.DOLocalMoveX(1f, 2f)
.OnComplete(()=>Debug.Log("OnComplete実行"));
// DOTween開始後1秒待機
yield return new WaitForSeconds(1f);
tween.Complete(); // X座標が1まで瞬間移動
}
CompleteメソッドはKillと違い、トゥイーンの最終地点までジャンプします。永久ループするDOTweenの場合は最終地点が存在しないため、Completeメソッドを実行しても止まらないので注意です
永久ループ終了後のコールバックは何を使うべき?
繰り返しになりますが、 「Killメソッド」だけが永久ループするトゥイーンを完全停止できます。 完全停止後にコールバックを実行させたいときは何を使えばよいでしょうか。
結論 「OnKillコールバック」 です。
IEnumerator Start()
{
var tween = transform.DOLocalMoveX(1f, 2f)
.SetLoops(-1);
.OnKill(()=>Debug.Log("OnKill実行"));
// DOTween開始後1秒待機
yield return new WaitForSeconds(1f);
tween.Kill();
}
OnCompleteは使えません。 OnKillを使うことで永久ループ後に処理を実行することできるのです。
DOTweenのコールバック関数の実行順
永久ループするDOTweenのまとめ
永久ループを設定したDOTweenの挙動について解説してきました。簡単にまとめます。
①SetLoopsに「-1」をセットすると永久ループ
②永久ループはKillで停止させる(Completeでは止まらない)
③永久ループ後の処理はOnKillを使う(OnCompleteは呼ばれない)
こんな感じです。 「SetLoopsを-1にセットしたときは、Completeは使えない」 ということを覚えておきましょう。
ゲーム中に永久ループさせるアニメーションは結構あります。その止め方とその後に処理を挟む方法は覚えておいて損はないです。ぜひこの記事をきっかけにDOTweenの永久ループ処理を見直してみてはいかがでしょうか。
最後にDOTweenの停止をまとめた表です。参考にしてみてください。
停止手段 | 停止可否 | 備考 |
---|---|---|
自然停止 | 不可 | 永久ループなので停止しない |
PauseまたはTogglePause | 可能 | 一時停止 |
Kill | 可能 | 完全停止 |
Complete | 不可 | Complete状態が存在しないため |
ここまで何度か登場している「Transform」。Transformとは、UnityではどのGameObjectにもセットされている特別なコンポーネントです。
「移動」「回転」「拡大縮小」といった重要な機能を持っています。 Transformの理解はUnityでのゲーム開発には必須です。 Transformの理解に自信がない方はこちらの記事を読んでみてください。
この記事が気に入ったらフォローしよう
「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
ぜひチャンネル登録をお願いします!
最後まで読んでいただきありがとうございました!
すばらしいDOTweenライフをお過ごしください。
- Unity2021.3.0f1
- DOTween v1.2.632