ゆーとぴあ。ブログ

技術の備忘録や、日記などを投稿します

【Unity】Taskのキャンセル処理を楽に行う拡張メソッド【AwaitTriggerExtensions】

概要

オブジェクトが削除または非アクティブになった際にasync/await処理が動き続けるのをキャンセルする拡張メソッド(自作)

使用例

[SerializeField]
private AwaitTriggerExtensions _awaitExt;

private async Task Hoge()
{
    Debug.Log("開始");
    await _awaitExt.CancelableAsync(CoroutineMethod(() => 
    {
        Debug.Log("終了");
    });
}

private IEnumerator CoroutineMethod(Action action = null)
{
    yield return new WaitForSeconds(3f);
    action?.Invoke();
}

①AwaitTriggerExtensionsをTaskのキャンセル処理を行いたいオブジェクトにアタッチ
②Action型を引数としたコルーチンを用意(遅延・終了処理用)
③任意の場所でCancelableAsyncを実行
※デフォルトでアタッチされたオブジェクトのOnDestroyが呼ばれたタイミングで自動的にキャンセルされるようになっていますが、_awaitExt.Cancel()を呼ぶことで任意のタイミングでキャンセルすることができます。

まとめ

正常にキャンセル処理は機能しますが、まだまだ納得いっていない点が多いです。
IEnumeratorのみしか使えなかったり、コールバックで終了処理を呼ぶ必要があったり(これが一番致命的でHogeのawaitが仕事をしていない😭😭😭)...
随時改善していきたいと思っているのでアドバイスがあればぜひお願いします!