Unity2023のAwaitableについて調べてみた

Awaitable型は非同期コードを公開するために使用され、Unityに特化した非同期の戻り値型も提供します。

docs.unity3d.com

Awaitableについて

UnityのAwaitableは、非同期コードの戻り値として特にUnity環境に適した型を提供します。これにより、非同期操作の完了まで待機するプロセスを表現でき、非同期メソッドの戻り値として利用されます。 例えば、Awaitable.NextFrameAsync(ct)メソッドは次のフレームまでの待機を非同期で実行し、UniTaskを返します。このUniTaskをawaitにより処理することで、非同期的に次のフレームまでの待機が可能です。

private async Awaitable HogeAsync(CancellationToken ct)
{
    Debug.Log(Time.frameCount);
    await Awaitable.NextFrameAsync(ct);
    Debug.Log("待機:" + Time.frameCount);
}

// 出力結果
1 // Start()が呼び出されたときのフレームカウント
待機:2 // 次のフレームでのフレームカウント

同じことをUniTaskでする場合は次のようなコードになります。

await UniTask.Yield();

その他

WaitForSecondsAsyncは指定秒待機します。

 private async Awaitable HogeAsync(CancellationToken ct)
{
    Debug.Log(Time.time);
    await Awaitable.WaitForSecondsAsync(seconds: 1f, cancellationToken: ct);
    Debug.Log("待機:" + Time.time);
}

キャンセル

CancellationTokenがキャンセルされた場合、OperationCanceledExceptionがスローされます。

private async Awaitable HogeAsync(CancellationToken ct)
{
    try
    {
        await Awaitable.WaitForSecondsAsync(seconds: 30f, cancellationToken: ct);

    }
    catch (OperationCanceledException)
    {
        Debug.Log("キャンセルされました");
    }
}