はじめに
今回は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
を使いこなしてる感もあって悪くはないのではないでしょうか。
ではまた。