はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【UniTask】AsAsyncUnitUniTaskを使ってUniTaskからUniTask<AsyncUnit>に変換をする

はじめに

今回は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.WhenAllUniTask.WhenAnyは引数をUniTaskUniTask<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を使いこなしてる感もあって悪くはないのではないでしょうか。

ではまた。