diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskWithToken.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskWithToken.cs index 0f5914a..696771a 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskWithToken.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskWithToken.cs @@ -1,6 +1,18 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Threading; +using UnityEngine; +using UnityEngine.Rendering; +#if ENABLE_UNITYWEBREQUEST && (!UNITY_2019_1_OR_NEWER || UNITASK_WEBREQUEST_SUPPORT) +using UnityEngine.Networking; +#endif +#if UNITASK_ADDRESSABLE_SUPPORT +using UnityEngine.ResourceManagement.AsyncOperations; +#endif +#if UNITASK_DOTWEEN_SUPPORT +using DG.Tweening; +#endif namespace Cysharp.Threading.Tasks { @@ -12,10 +24,13 @@ namespace Cysharp.Threading.Tasks #region UniTask.Delay public UniTask Yield(PlayerLoopTiming timing = PlayerLoopTiming.Update) => UniTask.Yield(timing, cancellationToken); + /// Similar as UniTask.Yield but guaranteed run on next frame. public UniTask NextFrame(PlayerLoopTiming timing = PlayerLoopTiming.Update) => UniTask.NextFrame(timing, cancellationToken); + /// Same as UniTask.Yield(PlayerLoopTiming.LastPostLateUpdate, cancellationToken). public UniTask WaitForEndOfFrame() => UniTask.WaitForEndOfFrame(cancellationToken); + /// Same as UniTask.Yield(PlayerLoopTiming.FixedUpdate, cancellationToken). public UniTask WaitForFixedUpdate() => UniTask.WaitForFixedUpdate(cancellationToken); public UniTask DelayFrame(int delayFrameCount, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update) @@ -34,45 +49,62 @@ namespace Cysharp.Threading.Tasks => UniTask.FromCanceled(cancellationToken); public UniTask FromCanceled() => UniTask.FromCanceled(cancellationToken); + /// helper of fire and forget void action. public void Void(Func asyncAction) => UniTask.Void(asyncAction, cancellationToken); + /// helper of create add UniTaskVoid to delegate. public Action Action(Func asyncAction) => UniTask.Action(asyncAction, cancellationToken); #if UNITY_2018_3_OR_NEWER + /// Create async void(UniTaskVoid) UnityAction. public UnityEngine.Events.UnityAction UnityAction(Func asyncAction) => UniTask.UnityAction(asyncAction, cancellationToken); #endif + /// Never complete. public UniTask Never() => UniTask.Never(cancellationToken); + /// Never complete. public UniTask Never() => UniTask.Never(cancellationToken); #endregion #region UniTask.Run + /// Run action on the threadPool and return to main thread if configureAwait = true. public async UniTask RunOnThreadPool(Action action, bool configureAwait = true) => await UniTask.RunOnThreadPool(action, configureAwait, cancellationToken); + /// Run action on the threadPool and return to main thread if configureAwait = true. public async UniTask RunOnThreadPool(Action action, object state, bool configureAwait = true) => await UniTask.RunOnThreadPool(action, state, configureAwait, cancellationToken); + /// Run action on the threadPool and return to main thread if configureAwait = true. public async UniTask RunOnThreadPool(Func action, bool configureAwait = true) => await UniTask.RunOnThreadPool(action, configureAwait, cancellationToken); + /// Run action on the threadPool and return to main thread if configureAwait = true. public async UniTask RunOnThreadPool(Func action, object state, bool configureAwait = true) => await UniTask.RunOnThreadPool(action, state, configureAwait, cancellationToken); + /// Run action on the threadPool and return to main thread if configureAwait = true. public async UniTask RunOnThreadPool(Func func, bool configureAwait = true) => await UniTask.RunOnThreadPool(func, configureAwait, cancellationToken); + /// Run action on the threadPool and return to main thread if configureAwait = true. public async UniTask RunOnThreadPool(Func> func, bool configureAwait = true) => await UniTask.RunOnThreadPool(func, configureAwait, cancellationToken); + /// Run action on the threadPool and return to main thread if configureAwait = true. public async UniTask RunOnThreadPool(Func func, object state, bool configureAwait = true) => await UniTask.RunOnThreadPool(func, state, configureAwait, cancellationToken); + /// Run action on the threadPool and return to main thread if configureAwait = true. public async UniTask RunOnThreadPool(Func> func, object state, bool configureAwait = true) => await UniTask.RunOnThreadPool(func, state, configureAwait, cancellationToken); #endregion #region UniTask.Threading #if UNITY_2018_3_OR_NEWER + /// If running on mainthread, do nothing. Otherwise, same as UniTask.Yield(PlayerLoopTiming.Update, cancellationToken). public SwitchToMainThreadAwaitable SwitchToMainThread() => UniTask.SwitchToMainThread(cancellationToken); + /// If running on mainthread, do nothing. Otherwise, same as UniTask.Yield(timing, cancellationToken). public SwitchToMainThreadAwaitable SwitchToMainThread(PlayerLoopTiming timing) => UniTask.SwitchToMainThread(timing, cancellationToken); + /// Return to mainthread(same as await SwitchToMainThread) after using scope is closed. public ReturnToMainThread ReturnToMainThread() => UniTask.ReturnToMainThread(cancellationToken); + /// Return to mainthread(same as await SwitchToMainThread) after using scope is closed. public ReturnToMainThread ReturnToMainThread(PlayerLoopTiming timing) => UniTask.ReturnToMainThread(timing, cancellationToken); #endif @@ -91,5 +123,43 @@ namespace Cysharp.Threading.Tasks public UniTask WaitUntilValueChanged(T target, Func monitorFunction, PlayerLoopTiming monitorTiming = PlayerLoopTiming.Update, IEqualityComparer equalityComparer = null) where T : class => UniTask.WaitUntilValueChanged(target, monitorFunction, monitorTiming, equalityComparer, cancellationToken); #endregion + #region Wrap + public UniTask Wrap(IEnumerator enumerator) + => enumerator.WithCancellation(cancellationToken); + public UniTaskCancelableAsyncEnumerable Wrap(IUniTaskAsyncEnumerable source) + => source.WithCancellation(cancellationToken); + /// Ignore task result when cancel raised first. + public UniTask Wrap(UniTask task) + => task.WithCancellation(cancellationToken); + /// Ignore task result when cancel raised first. + public UniTask Wrap(UniTask task) + => task.WithCancellation(cancellationToken); + public UniTask Wrap(AsyncGPUReadbackRequest asyncOperation) + => asyncOperation.WithCancellation(cancellationToken); + public UniTask Wrap(AsyncOperation asyncOperation) + => asyncOperation.WithCancellation(cancellationToken); + public UniTask Wrap(ResourceRequest asyncOperation) + => asyncOperation.WithCancellation(cancellationToken); +#if UNITASK_ASSETBUNDLE_SUPPORT + public UniTask Wrap(AssetBundleRequest asyncOperation) + => asyncOperation.WithCancellation(cancellationToken); +#endif +#if UNITASK_ASSETBUNDLE_SUPPORT + public UniTask Wrap(AssetBundleCreateRequest asyncOperation) + => asyncOperation.WithCancellation(cancellationToken); +#endif +#if ENABLE_UNITYWEBREQUEST && (!UNITY_2019_1_OR_NEWER || UNITASK_WEBREQUEST_SUPPORT) + public UniTask Wrap(UnityWebRequestAsyncOperation asyncOperation) + => asyncOperation.WithCancellation(cancellationToken); +#endif +#if UNITASK_ADDRESSABLE_SUPPORT + public static UniTask Wrap(AsyncOperationHandle handle) + => handle.WithCancellation(cancellationToken); +#endif +#if UNITASK_DOTWEEN_SUPPORT + public static UniTask Wrap(Tween tween) + => tween.WithCancellation(cancellationToken); +#endif + #endregion } }