以下の内容はhttps://bluebirdofoz.hatenablog.com/entry/2024/10/23/233720より取得しました。


UnityでMonoBehaviourの破棄を検知するキャンセルトークンを参照する

本日は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




以上の内容はhttps://bluebirdofoz.hatenablog.com/entry/2024/10/23/233720より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14