本日はUnityの小ネタ枠です。
UnityでMonoBehaviourの破棄を検知するキャンセルトークンを参照する方法です。
MonoBehaviour.destroyCancellationToken
MonoBehaviour.destroyCancellationTokenはMonoBehaviour が破棄されたときに発生するキャンセルトークンです。
Unity2022.2以降または2023.1以降で利用できます。
docs.unity3d.com
System.Threading.CancellationToken cancelToken = this.destroyCancellationToken; await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(10), cancelToken);
サンプルスクリプト
destroyCancellationTokenを参照して待機タスクのキャンセルを行う以下のサンプルスクリプトを作成しました。
using System; using UnityEngine; public class CancelTokenTest : MonoBehaviour { /// <summary> /// 本オブジェクトまたはコンポーネントの破棄を監視するためのCancellationToken /// </summary> private System.Threading.CancellationToken cancelToken => this.destroyCancellationToken; [ContextMenu("WaitFrame")] public async void WaitFrame() { try { // 再生モード時のみ実行する if (!Application.isPlaying) return; // 10秒待機する Debug.Log("待機タスクを開始します"); await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(10), cancelToken); // 待機タスクが完了したらログを出力する Debug.Log("10秒待機を完了しました"); } catch (OperationCanceledException) { // 待機タスクがキャンセルされた場合の処理 Debug.Log("タスクをキャンセルしました"); } } }
コンテキストメニューから関数を実行します。

オブジェクトが破棄されない場合はタスクが正常に完了します。

次に待機中にゲームオブジェクトを削除してみます。

以下の通りオブジェクトの破棄がキャンセルトークンで即座に検知されてタスクがキャンセルされます。

Tips
MonoBehaviour.destroyCancellationTokenが実装されていない以前のUnityの場合、以下のUniTaskのGetCancellationTokenOnDestroy関数を使ってオブジェクト破棄を検知するキャンセルトークンを取得できます。
bluebirdofoz.hatenablog.com