こんにちは、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の作り方
ToUniTaskメソッド
にCancellationToken
を渡します。
- CancellationTokenSource作成
- CancellationTokenを取得
- 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も停止します。
UniTaskはDOTweenのキャンセル挙動も設定可
- OnCompleteを呼ぶ
- OnKillだけを呼ぶ
といった、DOTweenを途中で停止(キャンセル)させたとき
数パターン分岐します。
UniTaskはそのあたりもサポート済みです。さすが。
先のサンプルコードに
OnComplete処理を追加してみます。
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();
}
TweenCancelBehaviour.Kill
を指定すると
キャンセル時にOnComplete
は呼ばれません。
.ToUniTask(TweenCancelBehaviour.Complete, token);
TweenCancelBehaviour.Complete
を設定すると、
OnCompleteも呼ばれるようになります。
各TweenCancelBehaviourの解説
DOTweenのキャンセル挙動を
TweenCancelBehaviour
で指定します。
いくつか種類があるため、
よく使うものを紹介します。
- × OnStepComplete
- × OnComplete
- ○ OnKill
Killまたは未指定の場合、
キャンセル時にOnKillだけ呼ばれます。
OnCompleteは呼ばれないので注意です。
内部処理はtween.Kill(false)
。
- × OnStepComplete
- ○ OnComplete
- ○ OnKill
Completeを指定すると
キャンセル時にOnComplete → OnKill
の順に呼ばれます。
内部処理はtween.Kill(true)
。
- ○ OnStepComplete
- ○ OnComplete
- ○ OnKill
CompleteWithSeqeunceCallbackを指定すると
キャンセル時にOnStepComplete → OnComplete → OnKill
の順に呼ばれます。
内部処理はtween.Complete(true)
。
詳しいDOTweenのコールバック順について
コチラの記事にまとめています。
よろしければどうぞ。
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