渋谷ほととぎす通信

「Unityをわかりやすく」初心者のためのゲーム作りブログ

【Unity】DOTweenをUniTaskで使う方法

【Unity】DOTweenをUniTaskで使う方法

こんにちは、Unityエンジニアのオオバです。

DOTweenをasync/awaitで実装する とき、
「UniTask一択」です。

わざわざC#デフォルトのTaskを使う必要はありません。

  • Unityを考慮したAPI
  • Taskより高機能
  • パフォーマンス面

これらがUniTaskを使う理由です。

本記事では具体的にDOTweenを
async/await化する上でのポイントを
解説していきます。

DOTweenをasync/awaitする方法はawaitするだけ

結論 Tweenをawaitするだけ です。
これで DOTweenをasync/await化 できます。

UniTaskがDOTweenをサポートしているためですね。
ありがたいです。

async UniTask StartTween()  
{
    await transform.DOLocalMove(Vector3.one, 1f);  
}

この通り超簡単ですよね。
ここから大事な キャンセル処理 の解説に入ります。

👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

キャンセル可能なasync/awaitのDOTweenの作り方

【Unity】DOTweenをUniTaskで使う方法_0

ToUniTaskメソッドCancellationTokenを渡します。

手順はコチラ
  1. CancellationTokenSource作成
  2. CancellationTokenを取得
  3. ToUniTaskでTweenにTokenを渡す

具体的なソースコードを見ていきましょう。

void Start()  
{
    // 1. CancellationTokenSource作成  
    var cts = new CancellationToken();  

    // 2. CancellationTokenを取得  
    var token = cts.Token;  

    transform.DOLocalMove(Vector3.one, 1f)  
        // 3. ToUniTaskでTweenにTokenを渡す  
        .ToUniTask(cancellationToken: token);  

    // キャンセル実行  
    cts.Cancel();  
}

CancellataionTokenSource
Cancelメソッドを呼び出すことで
Sourceから作られたTokenはキャンセルされます。

つまりDOTweenも停止します。

キャンセルしないTween

【Unity】DOTweenをUniTaskで使う方法_1

キャンセルしたTween

【Unity】DOTweenをUniTaskで使う方法_2

UniTaskはDOTweenのキャンセル挙動も設定可

  • OnCompleteを呼ぶ
  • OnKillだけを呼ぶ

といった、DOTweenを途中で停止(キャンセル)させたとき
数パターン分岐します。

UniTaskはそのあたりもサポート済みです。さすが。

先のサンプルコードに
OnComplete処理を追加してみます。

Tween終了時に非アクティブ
void Start()  
{
    // 1. CancellationTokenSource作成  
    var cts = new CancellationToken();  

    // 2. CancellationTokenを取得  
    var token = cts.Token;  

    transform.DOLocalMove(Vector3.one, 1f)  
        // 【追加処理】Tween完了時にGameObjectを非アクティブ  
        .OnComplete(()=>gameObject.SetActive(false))  
        // 3. ToUniTaskでTweenにTokenを渡す  
        .ToUniTask(cancellationToken: token);  

    // キャンセル実行  
    cts.Cancel();  
}
キャンセルしないTween

キャンセルしないTween

キャンセルしたTween。OnCompleteが呼ばれていない

キャンセルしたTween

TweenCancelBehaviour.Killを指定すると
キャンセル時にOnCompleteは呼ばれません。

.ToUniTask(TweenCancelBehaviour.Complete, token);  

TweenCancelBehaviour.Completeを設定すると、
OnCompleteも呼ばれるようになります。

各TweenCancelBehaviourの解説

DOTweenのキャンセル挙動を
TweenCancelBehaviourで指定します。

いくつか種類があるため、
よく使うものを紹介します。

Kill(デフォルト)
  • × OnStepComplete
  • × OnComplete
  • ○ OnKill

Killまたは未指定の場合、
キャンセル時にOnKillだけ呼ばれます。
OnCompleteは呼ばれないので注意です。

内部処理はtween.Kill(false)

Complete
  • × OnStepComplete
  • ○ OnComplete
  • ○ OnKill

Completeを指定すると
キャンセル時にOnComplete → OnKill
の順に呼ばれます。

内部処理はtween.Kill(true)

CompleteWithSeqeunceCallback
  • ○ OnStepComplete
  • ○ OnComplete
  • ○ OnKill

CompleteWithSeqeunceCallbackを指定すると
キャンセル時にOnStepComplete → OnComplete → OnKill
の順に呼ばれます。

内部処理はtween.Complete(true)

詳しいDOTweenのコールバック順について
コチラの記事にまとめています。
よろしければどうぞ。

まとめ: DOTweenのasync/await化

DOTweenをasync/await化する方法を紹介しました。

記事内容を簡単にまとめます。

  • UniTaskを使う
  • DOTweenにawaitを付ける
  • キャンセルしたいときはToUniTaskにTokenを渡す
  • キャンセル後の挙動も設定可

こんな感じです。

UniTaskを使うことで簡単に
DOTweenをasync/await化することができました。

最近はコルーチンを使うプロジェクトも
減ってきました。

これから新規で作るプロジェクトは
async/await一択でしょう。

その際はUniTaskは必須。
同時にDOTweenもasync/await化も必要です。

本記事を通してDOTweenをasync/awaitで使う方法
思い出してみてください。

「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
ぜひチャンネル登録をお願いします!

最後まで読んでいただきありがとうございました!
すばらしいDOTweenライフをお過ごしください。

オススメ記事
検証環境
  • Unity2022.3.4f1
  • UniTask v2.4.1
  • DOTween v1.2.632