🕑

UniTaskをWhenAllで並列待ちしたいのにvoidをawaitできないときはAsAsyncUnitUniTaskを使おう

2022/01/24に公開

タイトルが本編。以下蛇足。

UniTask.WhenAll は複数の非同期処理を await することができる。
ロードとアニメーションを並列で再生するが、ロードが早く終わってもアニメーションは最後まで再生させたい、みたいな時がたまーにある。

var animationTimespan = TimeSpan.FromSeconds(2.0F);
UniTask<Sprite> loadHogeImageAsync = // 略。なんらかの画像読み込み
// アニメーションと画像読み込みを並列に走らせるが、
// 読み込みが完了しても最低でもアニメーション分の時間を待つ
var result = await UniTask.WhenAll(loadHogeImageAsync,
    UniTask.Delay(animationTimespan)); 

しかしこれは Cannot assign 'void' to an implicitly-typed local variable でコンパイルエラーになる。

void だと駄目だから他の何でも良いので他の型に変換してやればよい。こんなとき UniTask 型からピッタリな AsAsyncUnitUniTask() というメソッドを生やせるのでこれを使う。

var result = await UniTask.WhenAll(loadHogeImageAsync,
    UniTask.Delay(animationTimespan).AsAsyncUnitUniTask()); 
// または
var (sprite, _) = await UniTask.WhenAll(loadHogeImageAsync,
    UniTask.Delay(animationTimespan).AsAsyncUnitUniTask()); 

こういうかゆいところに手が届くメソッドが用意されていたり、WhenAll/WhenAny の返り値の種類が豊富だったり、便利なライブラリなので勉強して損は無いと思います。

Discussion