🕑
UniTaskをWhenAllで並列待ちしたいのにvoidをawaitできないときはAsAsyncUnitUniTaskを使おう
タイトルが本編。以下蛇足。
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