渋谷ほととぎす通信

Unity・ゲーム開発 技術で一生食べていく情報発信

DOTweenをasync/await化して可読性の高いコードにしてみる件(キャンセルにも対応)

DOTweenの教科書という電子書籍を執筆しました。
興味ある方は読んでみてください。

この辺りの記事からの続きですが、
個人的な開発環境をコルーチンからasync/awaitに移行中です。

移行するにあたって僕が最もよく使うDOTweenのasync/await化は必須で、
特にキャンセル周りは演出を作る上では最重要と考えています。

本記事では安全に使いやすくキャンセルができるかを調査します。

async/awaitを使用したDOTweenサンプルコード

f:id:esakun:20191029135232g:plain

このように2秒動いた後、2秒動きます。
今までSequenceで書いていたようなことがawaitだけでかけてとても可読性が高いコードになります。

キャンセル処理を挟んだasync/awaitのDOTweenサンプルコード

f:id:esakun:20191029135217g:plain
内容としては1つ目のTweenを開始1秒後にキャンセルし、次のTweenを実行させます。

以下のサンプルコードのように、CancellationTokenをTweenにToAwaiterメソッドで渡し、キャンセルしたいときはトークンを発行したCancellationTokenSourceのCancelメソッドを実行します。

DOTweenのasync/await化は拡張メソッドで対応

DOTweenAwaiterExtensionという拡張メソッドを作成しDOTweenのasync/awaitを対応しています。
ToAwaiterメソッドにCancellationToken、キャンセル時の振る舞いEnumを渡すようにしています。

キャンセル時の振る舞いの種類

  • Kill・・・Kill()する
  • KillWithCompleteCallback・・・KillしてOnCompleteコールバックを呼ぶ(要はKill(true)する)
  • Complete・・・Complete()する

参考 : DOTweenのコールバック関数の実行順 - 渋谷ほととぎす通信

経験上この3種類で、大抵まかなえているためこのような実装になっています。

また、キャンセル処理を実行すると例外伝播するため、タスクの実行処理をtry-catchで囲まないと処理が止まりますのでご注意を。

以下DOTweenAwaiterExtensionの全文です。

最後に

コールバックの連鎖になりがちなTweenですが、
明るい兆しが今回のasync/await化で見えてきました。

CancellationTokenを毎回作らないといけない、 try-catchで囲まないといけないというのは、若干面倒臭いですが、
そのデメリットを超えたメリットを感じています。

もっと詳しくDOTweenのことを知りたい方は、
DOTweenの教科書を読んでみてください。

参考