渋谷ほととぎす通信

新しいこと、枯れたこと問わず大庭が興味を持ったものを調査、生活の効率を求める完全趣味の技術ブログ。基礎を大事にしています。

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


この辺りの記事からの続きですが、個人的な開発環境をコルーチンから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で囲まないといけないというのは、若干面倒臭いですが、そのデメリットを超えたメリットを感じています。

参考