はじめに
今回はAsAsyncUnitUniTaskを紹介したいと思います。
突然ですが、UniTaskを利用していて以下のような状態になっとことはないでしょうか。
// 完了済のUniTaskを生成(awaitした瞬間10が返ってくる) UniTask<int> task1 = UniTask.FromResult(10); // 1フレーム待ち、デバッグをする処理 UniTask task2 = UniTask.Create(async () => { await UniTask.Yield(); Debug.Log("Hello"); }); var (result1, _) = await UniTask.WhenAll(task1, task2);
一見良さそうに見えますが、UniTask.WhenAllやUniTask.WhenAnyは引数をUniTaskかUniTask<T>のどちらか一方に合わせないとエラーになってしまうんですよね。
それを解決するためにAsAsyncUnitUniTaskがとても役に立つので、見ていきましょう。
今まで記述していたコード
今までこれを実現するために以下のようなコードを書いていました。
// 完了済のUniTaskを生成(awaitした瞬間10が返ってくる) UniTask<int> task1 = UniTask.FromResult(10); // 1フレーム待ち、デバッグをする処理 UniTask task2 = UniTask.Create(async () => { await UniTask.Yield(); Debug.Log("Hello"); }); // task2終了後にAsyncUnitを返す処理を追加 var (result1, _) = await UniTask.WhenAll(task1, task2.ContinueWith(() => AsyncUnit.Default));
ContinueWithを後ろにくっつけて、処理が終わった後にAsyncUnitを返すようにした形です。
しかしこう言った処理をわざわざ書く必要はなく、UniTask側でUniTask -> UniTask<AsyncUnit>への変換を行なってくれるメソッドが定義されているみたいです。
github.com
public UniTask<AsyncUnit> AsAsyncUnitUniTask()
これを使って書き直してみたのは以下になります。
// 完了済のUniTaskを生成(awaitした瞬間10が返ってくる) UniTask<int> task1 = UniTask.FromResult(10); // 1フレーム待ち、デバッグをする処理 UniTask task2 = UniTask.Create(async () => { await UniTask.Yield(); Debug.Log("Hello"); }); var (result1, _) = await UniTask.WhenAll(task1, task2.AsAsyncUnitUniTask());
さいごに
結構些細なことではありますが、地味に便利なメソッドだと思います。
正直これを使わずとも色々な対処法はありますが、使っているとUniTaskを使いこなしてる感もあって悪くはないのではないでしょうか。
ではまた。