#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member #if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT using System; using System.Threading; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; namespace Cysharp.Threading.Tasks { public static partial class UnityAsyncExtensions { public static AsyncUnityEventHandler GetAsyncEventHandler(this UnityEvent unityEvent, CancellationToken cancellationToken) { return new AsyncUnityEventHandler(unityEvent, cancellationToken, false); } public static UniTask OnInvokeAsync(this UnityEvent unityEvent, CancellationToken cancellationToken) { return new AsyncUnityEventHandler(unityEvent, cancellationToken, true).OnInvokeAsync(); } public static IUniTaskAsyncEnumerable<AsyncUnit> OnInvokeAsAsyncEnumerable(this UnityEvent unityEvent, CancellationToken cancellationToken) { return new UnityEventHandlerAsyncEnumerable(unityEvent, cancellationToken); } public static AsyncUnityEventHandler<T> GetAsyncEventHandler<T>(this UnityEvent<T> unityEvent, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<T>(unityEvent, cancellationToken, false); } public static UniTask<T> OnInvokeAsync<T>(this UnityEvent<T> unityEvent, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<T>(unityEvent, cancellationToken, true).OnInvokeAsync(); } public static IUniTaskAsyncEnumerable<T> OnInvokeAsAsyncEnumerable<T>(this UnityEvent<T> unityEvent, CancellationToken cancellationToken) { return new UnityEventHandlerAsyncEnumerable<T>(unityEvent, cancellationToken); } public static IAsyncClickEventHandler GetAsyncClickEventHandler(this Button button) { return new AsyncUnityEventHandler(button.onClick, button.GetCancellationTokenOnDestroy(), false); } public static IAsyncClickEventHandler GetAsyncClickEventHandler(this Button button, CancellationToken cancellationToken) { return new AsyncUnityEventHandler(button.onClick, cancellationToken, false); } public static UniTask OnClickAsync(this Button button) { return new AsyncUnityEventHandler(button.onClick, button.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); } public static UniTask OnClickAsync(this Button button, CancellationToken cancellationToken) { return new AsyncUnityEventHandler(button.onClick, cancellationToken, true).OnInvokeAsync(); } public static IUniTaskAsyncEnumerable<AsyncUnit> OnClickAsAsyncEnumerable(this Button button) { return new UnityEventHandlerAsyncEnumerable(button.onClick, button.GetCancellationTokenOnDestroy()); } public static IUniTaskAsyncEnumerable<AsyncUnit> OnClickAsAsyncEnumerable(this Button button, CancellationToken cancellationToken) { return new UnityEventHandlerAsyncEnumerable(button.onClick, cancellationToken); } public static IAsyncValueChangedEventHandler<bool> GetAsyncValueChangedEventHandler(this Toggle toggle) { return new AsyncUnityEventHandler<bool>(toggle.onValueChanged, toggle.GetCancellationTokenOnDestroy(), false); } public static IAsyncValueChangedEventHandler<bool> GetAsyncValueChangedEventHandler(this Toggle toggle, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<bool>(toggle.onValueChanged, cancellationToken, false); } public static UniTask<bool> OnValueChangedAsync(this Toggle toggle) { return new AsyncUnityEventHandler<bool>(toggle.onValueChanged, toggle.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); } public static UniTask<bool> OnValueChangedAsync(this Toggle toggle, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<bool>(toggle.onValueChanged, cancellationToken, true).OnInvokeAsync(); } public static IUniTaskAsyncEnumerable<bool> OnValueChangedAsAsyncEnumerable(this Toggle toggle) { return new UnityEventHandlerAsyncEnumerable<bool>(toggle.onValueChanged, toggle.GetCancellationTokenOnDestroy()); } public static IUniTaskAsyncEnumerable<bool> OnValueChangedAsAsyncEnumerable(this Toggle toggle, CancellationToken cancellationToken) { return new UnityEventHandlerAsyncEnumerable<bool>(toggle.onValueChanged, cancellationToken); } public static IAsyncValueChangedEventHandler<float> GetAsyncValueChangedEventHandler(this Scrollbar scrollbar) { return new AsyncUnityEventHandler<float>(scrollbar.onValueChanged, scrollbar.GetCancellationTokenOnDestroy(), false); } public static IAsyncValueChangedEventHandler<float> GetAsyncValueChangedEventHandler(this Scrollbar scrollbar, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<float>(scrollbar.onValueChanged, cancellationToken, false); } public static UniTask<float> OnValueChangedAsync(this Scrollbar scrollbar) { return new AsyncUnityEventHandler<float>(scrollbar.onValueChanged, scrollbar.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); } public static UniTask<float> OnValueChangedAsync(this Scrollbar scrollbar, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<float>(scrollbar.onValueChanged, cancellationToken, true).OnInvokeAsync(); } public static IUniTaskAsyncEnumerable<float> OnValueChangedAsAsyncEnumerable(this Scrollbar scrollbar) { return new UnityEventHandlerAsyncEnumerable<float>(scrollbar.onValueChanged, scrollbar.GetCancellationTokenOnDestroy()); } public static IUniTaskAsyncEnumerable<float> OnValueChangedAsAsyncEnumerable(this Scrollbar scrollbar, CancellationToken cancellationToken) { return new UnityEventHandlerAsyncEnumerable<float>(scrollbar.onValueChanged, cancellationToken); } public static IAsyncValueChangedEventHandler<Vector2> GetAsyncValueChangedEventHandler(this ScrollRect scrollRect) { return new AsyncUnityEventHandler<Vector2>(scrollRect.onValueChanged, scrollRect.GetCancellationTokenOnDestroy(), false); } public static IAsyncValueChangedEventHandler<Vector2> GetAsyncValueChangedEventHandler(this ScrollRect scrollRect, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<Vector2>(scrollRect.onValueChanged, cancellationToken, false); } public static UniTask<Vector2> OnValueChangedAsync(this ScrollRect scrollRect) { return new AsyncUnityEventHandler<Vector2>(scrollRect.onValueChanged, scrollRect.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); } public static UniTask<Vector2> OnValueChangedAsync(this ScrollRect scrollRect, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<Vector2>(scrollRect.onValueChanged, cancellationToken, true).OnInvokeAsync(); } public static IUniTaskAsyncEnumerable<Vector2> OnValueChangedAsAsyncEnumerable(this ScrollRect scrollRect) { return new UnityEventHandlerAsyncEnumerable<Vector2>(scrollRect.onValueChanged, scrollRect.GetCancellationTokenOnDestroy()); } public static IUniTaskAsyncEnumerable<Vector2> OnValueChangedAsAsyncEnumerable(this ScrollRect scrollRect, CancellationToken cancellationToken) { return new UnityEventHandlerAsyncEnumerable<Vector2>(scrollRect.onValueChanged, cancellationToken); } public static IAsyncValueChangedEventHandler<float> GetAsyncValueChangedEventHandler(this Slider slider) { return new AsyncUnityEventHandler<float>(slider.onValueChanged, slider.GetCancellationTokenOnDestroy(), false); } public static IAsyncValueChangedEventHandler<float> GetAsyncValueChangedEventHandler(this Slider slider, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<float>(slider.onValueChanged, cancellationToken, false); } public static UniTask<float> OnValueChangedAsync(this Slider slider) { return new AsyncUnityEventHandler<float>(slider.onValueChanged, slider.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); } public static UniTask<float> OnValueChangedAsync(this Slider slider, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<float>(slider.onValueChanged, cancellationToken, true).OnInvokeAsync(); } public static IUniTaskAsyncEnumerable<float> OnValueChangedAsAsyncEnumerable(this Slider slider) { return new UnityEventHandlerAsyncEnumerable<float>(slider.onValueChanged, slider.GetCancellationTokenOnDestroy()); } public static IUniTaskAsyncEnumerable<float> OnValueChangedAsAsyncEnumerable(this Slider slider, CancellationToken cancellationToken) { return new UnityEventHandlerAsyncEnumerable<float>(slider.onValueChanged, cancellationToken); } public static IAsyncEndEditEventHandler<string> GetAsyncEndEditEventHandler(this InputField inputField) { return new AsyncUnityEventHandler<string>(inputField.onEndEdit, inputField.GetCancellationTokenOnDestroy(), false); } public static IAsyncEndEditEventHandler<string> GetAsyncEndEditEventHandler(this InputField inputField, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<string>(inputField.onEndEdit, cancellationToken, false); } public static UniTask<string> OnEndEditAsync(this InputField inputField) { return new AsyncUnityEventHandler<string>(inputField.onEndEdit, inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); } public static UniTask<string> OnEndEditAsync(this InputField inputField, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<string>(inputField.onEndEdit, cancellationToken, true).OnInvokeAsync(); } public static IUniTaskAsyncEnumerable<string> OnEndEditAsAsyncEnumerable(this InputField inputField) { return new UnityEventHandlerAsyncEnumerable<string>(inputField.onEndEdit, inputField.GetCancellationTokenOnDestroy()); } public static IUniTaskAsyncEnumerable<string> OnEndEditAsAsyncEnumerable(this InputField inputField, CancellationToken cancellationToken) { return new UnityEventHandlerAsyncEnumerable<string>(inputField.onEndEdit, cancellationToken); } public static IAsyncValueChangedEventHandler<string> GetAsyncValueChangedEventHandler(this InputField inputField) { return new AsyncUnityEventHandler<string>(inputField.onValueChanged, inputField.GetCancellationTokenOnDestroy(), false); } public static IAsyncValueChangedEventHandler<string> GetAsyncValueChangedEventHandler(this InputField inputField, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<string>(inputField.onValueChanged, cancellationToken, false); } public static UniTask<string> OnValueChangedAsync(this InputField inputField) { return new AsyncUnityEventHandler<string>(inputField.onValueChanged, inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); } public static UniTask<string> OnValueChangedAsync(this InputField inputField, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<string>(inputField.onValueChanged, cancellationToken, true).OnInvokeAsync(); } public static IUniTaskAsyncEnumerable<string> OnValueChangedAsAsyncEnumerable(this InputField inputField) { return new UnityEventHandlerAsyncEnumerable<string>(inputField.onValueChanged, inputField.GetCancellationTokenOnDestroy()); } public static IUniTaskAsyncEnumerable<string> OnValueChangedAsAsyncEnumerable(this InputField inputField, CancellationToken cancellationToken) { return new UnityEventHandlerAsyncEnumerable<string>(inputField.onValueChanged, cancellationToken); } public static IAsyncValueChangedEventHandler<int> GetAsyncValueChangedEventHandler(this Dropdown dropdown) { return new AsyncUnityEventHandler<int>(dropdown.onValueChanged, dropdown.GetCancellationTokenOnDestroy(), false); } public static IAsyncValueChangedEventHandler<int> GetAsyncValueChangedEventHandler(this Dropdown dropdown, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<int>(dropdown.onValueChanged, cancellationToken, false); } public static UniTask<int> OnValueChangedAsync(this Dropdown dropdown) { return new AsyncUnityEventHandler<int>(dropdown.onValueChanged, dropdown.GetCancellationTokenOnDestroy(), true).OnInvokeAsync(); } public static UniTask<int> OnValueChangedAsync(this Dropdown dropdown, CancellationToken cancellationToken) { return new AsyncUnityEventHandler<int>(dropdown.onValueChanged, cancellationToken, true).OnInvokeAsync(); } public static IUniTaskAsyncEnumerable<int> OnValueChangedAsAsyncEnumerable(this Dropdown dropdown) { return new UnityEventHandlerAsyncEnumerable<int>(dropdown.onValueChanged, dropdown.GetCancellationTokenOnDestroy()); } public static IUniTaskAsyncEnumerable<int> OnValueChangedAsAsyncEnumerable(this Dropdown dropdown, CancellationToken cancellationToken) { return new UnityEventHandlerAsyncEnumerable<int>(dropdown.onValueChanged, cancellationToken); } } public interface IAsyncClickEventHandler : IDisposable { UniTask OnClickAsync(); } public interface IAsyncValueChangedEventHandler<T> : IDisposable { UniTask<T> OnValueChangedAsync(); } public interface IAsyncEndEditEventHandler<T> : IDisposable { UniTask<T> OnEndEditAsync(); } // for TMP_PRO public interface IAsyncEndTextSelectionEventHandler<T> : IDisposable { UniTask<T> OnEndTextSelectionAsync(); } public interface IAsyncTextSelectionEventHandler<T> : IDisposable { UniTask<T> OnTextSelectionAsync(); } public interface IAsyncDeselectEventHandler<T> : IDisposable { UniTask<T> OnDeselectAsync(); } public interface IAsyncSelectEventHandler<T> : IDisposable { UniTask<T> OnSelectAsync(); } public interface IAsyncSubmitEventHandler<T> : IDisposable { UniTask<T> OnSubmitAsync(); } internal class TextSelectionEventConverter : UnityEvent<(string, int, int)>, IDisposable { readonly UnityEvent<string, int, int> innerEvent; readonly UnityAction<string, int, int> invokeDelegate; public TextSelectionEventConverter(UnityEvent<string, int, int> unityEvent) { this.innerEvent = unityEvent; this.invokeDelegate = InvokeCore; innerEvent.AddListener(invokeDelegate); } void InvokeCore(string item1, int item2, int item3) { innerEvent.Invoke(item1, item2, item3); } public void Dispose() { innerEvent.RemoveListener(invokeDelegate); } } public class AsyncUnityEventHandler : IUniTaskSource, IDisposable, IAsyncClickEventHandler { static Action<object> cancellationCallback = CancellationCallback; readonly UnityAction action; readonly UnityEvent unityEvent; CancellationToken cancellationToken; CancellationTokenRegistration registration; bool isDisposed; bool callOnce; UniTaskCompletionSourceCore<AsyncUnit> core; public AsyncUnityEventHandler(UnityEvent unityEvent, CancellationToken cancellationToken, bool callOnce) { this.cancellationToken = cancellationToken; if (cancellationToken.IsCancellationRequested) { isDisposed = true; return; } this.action = Invoke; this.unityEvent = unityEvent; this.callOnce = callOnce; unityEvent.AddListener(action); if (cancellationToken.CanBeCanceled) { registration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this); } TaskTracker.TrackActiveTask(this, 3); } public UniTask OnInvokeAsync() { core.Reset(); if (isDisposed) { core.TrySetCanceled(this.cancellationToken); } return new UniTask(this, core.Version); } void Invoke() { core.TrySetResult(AsyncUnit.Default); } static void CancellationCallback(object state) { var self = (AsyncUnityEventHandler)state; self.Dispose(); } public void Dispose() { if (!isDisposed) { isDisposed = true; TaskTracker.RemoveTracking(this); registration.Dispose(); if (unityEvent != null) { unityEvent.RemoveListener(action); } core.TrySetCanceled(cancellationToken); } } UniTask IAsyncClickEventHandler.OnClickAsync() { return OnInvokeAsync(); } void IUniTaskSource.GetResult(short token) { try { core.GetResult(token); } finally { if (callOnce) { Dispose(); } } } UniTaskStatus IUniTaskSource.GetStatus(short token) { return core.GetStatus(token); } UniTaskStatus IUniTaskSource.UnsafeGetStatus() { return core.UnsafeGetStatus(); } void IUniTaskSource.OnCompleted(Action<object> continuation, object state, short token) { core.OnCompleted(continuation, state, token); } } public class AsyncUnityEventHandler<T> : IUniTaskSource<T>, IDisposable, IAsyncValueChangedEventHandler<T>, IAsyncEndEditEventHandler<T> , IAsyncEndTextSelectionEventHandler<T>, IAsyncTextSelectionEventHandler<T>, IAsyncDeselectEventHandler<T>, IAsyncSelectEventHandler<T>, IAsyncSubmitEventHandler<T> { static Action<object> cancellationCallback = CancellationCallback; readonly UnityAction<T> action; readonly UnityEvent<T> unityEvent; CancellationToken cancellationToken; CancellationTokenRegistration registration; bool isDisposed; bool callOnce; UniTaskCompletionSourceCore<T> core; public AsyncUnityEventHandler(UnityEvent<T> unityEvent, CancellationToken cancellationToken, bool callOnce) { this.cancellationToken = cancellationToken; if (cancellationToken.IsCancellationRequested) { isDisposed = true; return; } this.action = Invoke; this.unityEvent = unityEvent; this.callOnce = callOnce; unityEvent.AddListener(action); if (cancellationToken.CanBeCanceled) { registration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this); } TaskTracker.TrackActiveTask(this, 3); } public UniTask<T> OnInvokeAsync() { core.Reset(); if (isDisposed) { core.TrySetCanceled(this.cancellationToken); } return new UniTask<T>(this, core.Version); } void Invoke(T result) { core.TrySetResult(result); } static void CancellationCallback(object state) { var self = (AsyncUnityEventHandler<T>)state; self.Dispose(); } public void Dispose() { if (!isDisposed) { isDisposed = true; TaskTracker.RemoveTracking(this); registration.Dispose(); if (unityEvent != null) { // Dispose inner delegate for TextSelectionEventConverter if (unityEvent is IDisposable disp) { disp.Dispose(); } unityEvent.RemoveListener(action); } core.TrySetCanceled(); } } UniTask<T> IAsyncValueChangedEventHandler<T>.OnValueChangedAsync() { return OnInvokeAsync(); } UniTask<T> IAsyncEndEditEventHandler<T>.OnEndEditAsync() { return OnInvokeAsync(); } UniTask<T> IAsyncEndTextSelectionEventHandler<T>.OnEndTextSelectionAsync() { return OnInvokeAsync(); } UniTask<T> IAsyncTextSelectionEventHandler<T>.OnTextSelectionAsync() { return OnInvokeAsync(); } UniTask<T> IAsyncDeselectEventHandler<T>.OnDeselectAsync() { return OnInvokeAsync(); } UniTask<T> IAsyncSelectEventHandler<T>.OnSelectAsync() { return OnInvokeAsync(); } UniTask<T> IAsyncSubmitEventHandler<T>.OnSubmitAsync() { return OnInvokeAsync(); } T IUniTaskSource<T>.GetResult(short token) { try { return core.GetResult(token); } finally { if (callOnce) { Dispose(); } } } void IUniTaskSource.GetResult(short token) { ((IUniTaskSource<T>)this).GetResult(token); } UniTaskStatus IUniTaskSource.GetStatus(short token) { return core.GetStatus(token); } UniTaskStatus IUniTaskSource.UnsafeGetStatus() { return core.UnsafeGetStatus(); } void IUniTaskSource.OnCompleted(Action<object> continuation, object state, short token) { core.OnCompleted(continuation, state, token); } } public class UnityEventHandlerAsyncEnumerable : IUniTaskAsyncEnumerable<AsyncUnit> { readonly UnityEvent unityEvent; readonly CancellationToken cancellationToken1; public UnityEventHandlerAsyncEnumerable(UnityEvent unityEvent, CancellationToken cancellationToken) { this.unityEvent = unityEvent; this.cancellationToken1 = cancellationToken; } public IUniTaskAsyncEnumerator<AsyncUnit> GetAsyncEnumerator(CancellationToken cancellationToken = default) { if (this.cancellationToken1 == cancellationToken) { return new UnityEventHandlerAsyncEnumerator(unityEvent, this.cancellationToken1, CancellationToken.None); } else { return new UnityEventHandlerAsyncEnumerator(unityEvent, this.cancellationToken1, cancellationToken); } } class UnityEventHandlerAsyncEnumerator : MoveNextSource, IUniTaskAsyncEnumerator<AsyncUnit> { static readonly Action<object> cancel1 = OnCanceled1; static readonly Action<object> cancel2 = OnCanceled2; readonly UnityEvent unityEvent; CancellationToken cancellationToken1; CancellationToken cancellationToken2; UnityAction unityAction; CancellationTokenRegistration registration1; CancellationTokenRegistration registration2; bool isDisposed; public UnityEventHandlerAsyncEnumerator(UnityEvent unityEvent, CancellationToken cancellationToken1, CancellationToken cancellationToken2) { this.unityEvent = unityEvent; this.cancellationToken1 = cancellationToken1; this.cancellationToken2 = cancellationToken2; } public AsyncUnit Current => default; public UniTask<bool> MoveNextAsync() { cancellationToken1.ThrowIfCancellationRequested(); cancellationToken2.ThrowIfCancellationRequested(); completionSource.Reset(); if (unityAction == null) { unityAction = Invoke; TaskTracker.TrackActiveTask(this, 3); unityEvent.AddListener(unityAction); if (cancellationToken1.CanBeCanceled) { registration1 = cancellationToken1.RegisterWithoutCaptureExecutionContext(cancel1, this); } if (cancellationToken2.CanBeCanceled) { registration2 = cancellationToken1.RegisterWithoutCaptureExecutionContext(cancel2, this); } } return new UniTask<bool>(this, completionSource.Version); } void Invoke() { completionSource.TrySetResult(true); } static void OnCanceled1(object state) { var self = (UnityEventHandlerAsyncEnumerator)state; self.DisposeAsync().Forget(); } static void OnCanceled2(object state) { var self = (UnityEventHandlerAsyncEnumerator)state; self.DisposeAsync().Forget(); } public UniTask DisposeAsync() { if (!isDisposed) { isDisposed = true; TaskTracker.RemoveTracking(this); registration1.Dispose(); registration2.Dispose(); unityEvent.RemoveListener(unityAction); } return default; } } } public class UnityEventHandlerAsyncEnumerable<T> : IUniTaskAsyncEnumerable<T> { readonly UnityEvent<T> unityEvent; readonly CancellationToken cancellationToken1; public UnityEventHandlerAsyncEnumerable(UnityEvent<T> unityEvent, CancellationToken cancellationToken) { this.unityEvent = unityEvent; this.cancellationToken1 = cancellationToken; } public IUniTaskAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken cancellationToken = default) { if (this.cancellationToken1 == cancellationToken) { return new UnityEventHandlerAsyncEnumerator(unityEvent, this.cancellationToken1, CancellationToken.None); } else { return new UnityEventHandlerAsyncEnumerator(unityEvent, this.cancellationToken1, cancellationToken); } } class UnityEventHandlerAsyncEnumerator : MoveNextSource, IUniTaskAsyncEnumerator<T> { static readonly Action<object> cancel1 = OnCanceled1; static readonly Action<object> cancel2 = OnCanceled2; readonly UnityEvent<T> unityEvent; CancellationToken cancellationToken1; CancellationToken cancellationToken2; UnityAction<T> unityAction; CancellationTokenRegistration registration1; CancellationTokenRegistration registration2; bool isDisposed; public UnityEventHandlerAsyncEnumerator(UnityEvent<T> unityEvent, CancellationToken cancellationToken1, CancellationToken cancellationToken2) { this.unityEvent = unityEvent; this.cancellationToken1 = cancellationToken1; this.cancellationToken2 = cancellationToken2; } public T Current { get; private set; } public UniTask<bool> MoveNextAsync() { cancellationToken1.ThrowIfCancellationRequested(); cancellationToken2.ThrowIfCancellationRequested(); completionSource.Reset(); if (unityAction == null) { unityAction = Invoke; TaskTracker.TrackActiveTask(this, 3); unityEvent.AddListener(unityAction); if (cancellationToken1.CanBeCanceled) { registration1 = cancellationToken1.RegisterWithoutCaptureExecutionContext(cancel1, this); } if (cancellationToken2.CanBeCanceled) { registration2 = cancellationToken1.RegisterWithoutCaptureExecutionContext(cancel2, this); } } return new UniTask<bool>(this, completionSource.Version); } void Invoke(T value) { Current = value; completionSource.TrySetResult(true); } static void OnCanceled1(object state) { var self = (UnityEventHandlerAsyncEnumerator)state; self.DisposeAsync().Forget(); } static void OnCanceled2(object state) { var self = (UnityEventHandlerAsyncEnumerator)state; self.DisposeAsync().Forget(); } public UniTask DisposeAsync() { if (!isDisposed) { isDisposed = true; TaskTracker.RemoveTracking(this); registration1.Dispose(); registration2.Dispose(); if (unityEvent is IDisposable disp) { disp.Dispose(); } unityEvent.RemoveListener(unityAction); } return default; } } } } #endif