以下のコードをどこかに貼り付ければすぐ使えます。
using System.Threading;
using UnityEngine;
namespace Module._Engine
{
/// <summary>
/// アプリケーション終了時にキャンセルされるCancellationTokenを提供
/// グローバルにどこからでもアクセス可能
/// </summary>
public static class ApplicationCancellationToken
{
private static CancellationTokenSource _source;
private static bool _isInitialized;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
private static void OnSubsystemRegistration()
{
_isInitialized = false;
_source?.Dispose();
_source = null;
}
/// <summary>
/// アプリケーション終了時にキャンセルされるCancellationToken
/// </summary>
public static CancellationToken Token
{
get
{
EnsureInitialized();
return _source.Token;
}
}
/// <summary>
/// 初期化
/// </summary>
private static void EnsureInitialized()
{
if (_isInitialized) return;
_source = new CancellationTokenSource();
Application.quitting += OnApplicationQuitting;
_isInitialized = true;
}
/// <summary>
/// アプリケーション終了時
/// </summary>
private static void OnApplicationQuitting()
{
_source?.Cancel();
_source?.Dispose();
Application.quitting -= OnApplicationQuitting;
}
}
}
使用時は単に
await UniTask.Delay(100, cancellationToken: ApplicationCancellationToken.Token);
みたいな感じでcancellation tokenとしてぶっこめばOKです。