From b4468b4ebafc6b5b09bd9d8ee9191494166dbad0 Mon Sep 17 00:00:00 2001 From: neuecc Date: Fri, 5 Jun 2020 12:32:16 +0900 Subject: [PATCH] improve DOTween Extensions --- .gitignore | 46 ++++++++ .../External/DoTweenAsyncExtensions.cs | 108 ++++++++++++------ src/UniTask/Assets/Scenes/SandboxMain.cs | 52 ++++++--- 3 files changed, 158 insertions(+), 48 deletions(-) diff --git a/.gitignore b/.gitignore index bddc628..5a4e7b1 100644 --- a/.gitignore +++ b/.gitignore @@ -159,3 +159,49 @@ src/UniTask/UniTask.Tests.Editor.csproj src/UniTask/UniTask.*.unitypackage src/UniTask/UniTask.Linq.csproj + +src/UniTask/DOTween.Modules.csproj + +src/UniTask/Unity.Addressables.csproj + +src/UniTask/Unity.Addressables.Editor.csproj + +src/UniTask/Unity.Analytics.DataPrivacy.csproj + +src/UniTask/Unity.Recorder.csproj + +src/UniTask/Unity.Recorder.Editor.csproj + +src/UniTask/Unity.ResourceManager.csproj + +src/UniTask/Unity.Rider.Editor.csproj + +src/UniTask/Unity.ScriptableBuildPipeline.csproj + +src/UniTask/Unity.ScriptableBuildPipeline.Editor.csproj + +src/UniTask/Unity.TextMeshPro.csproj + +src/UniTask/Unity.TextMeshPro.Editor.csproj + +src/UniTask/Unity.Timeline.csproj + +src/UniTask/Unity.Timeline.Editor.csproj + +src/UniTask/Unity.VisualStudio.Editor.csproj + +src/UniTask/Unity.VSCode.Editor.csproj + +src/UniTask/UnityEditor.CacheServer.csproj + +src/UniTask/UnityEditor.TestRunner.csproj + +src/UniTask/UnityEditor.UI.csproj + +src/UniTask/UnityEngine.Advertisements.csproj + +src/UniTask/UnityEngine.Monetization.csproj + +src/UniTask/UnityEngine.TestRunner.csproj + +src/UniTask/UnityEngine.UI.csproj diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/External/DoTweenAsyncExtensions.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/External/DoTweenAsyncExtensions.cs index 1858776..fc0def4 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/External/DoTweenAsyncExtensions.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/External/DoTweenAsyncExtensions.cs @@ -93,28 +93,30 @@ namespace Cysharp.Threading.Tasks TaskPool.RegisterSizeGetter(typeof(TweenConfiguredSource), () => pool.Size); } - static readonly Action CancellationCallbackDelegate = CancellationCallback; static readonly TweenCallback EmptyTweenCallback = () => { }; readonly TweenCallback onKillDelegate; + readonly TweenCallback onUpdateDelegate; Tween tween; TweenCancelBehaviour cancelBehaviour; CancellationToken cancellationToken; bool canceled; - CancellationTokenRegistration cancellationTokenRegistration; + TweenCallback originalUpdateAction; UniTaskCompletionSourceCore core; TweenConfiguredSource() { onKillDelegate = OnKill; + onUpdateDelegate = OnUpdate; } public static IUniTaskSource Create(Tween tween, TweenCancelBehaviour cancelBehaviour, CancellationToken cancellationToken, out short token) { if (cancellationToken.IsCancellationRequested) { + DoCancelBeforeCreate(tween, cancelBehaviour); return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token); } @@ -127,27 +129,25 @@ namespace Cysharp.Threading.Tasks result.cancelBehaviour = cancelBehaviour; result.cancellationToken = cancellationToken; - TaskTracker.TrackActiveTask(result, 3); + result.originalUpdateAction = tween.onUpdate; + result.canceled = false; - result.RegisterEvent(); + if (result.originalUpdateAction == result.onUpdateDelegate) + { + result.originalUpdateAction = null; + } + + tween.onUpdate = result.onUpdateDelegate; + tween.onKill = result.onKillDelegate; + + TaskTracker.TrackActiveTask(result, 3); token = result.core.Version; return result; } - void RegisterEvent() - { - if (cancellationToken.CanBeCanceled) - { - cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(CancellationCallbackDelegate, this); - } - - tween.OnKill(onKillDelegate); - } - void OnKill() { - cancellationTokenRegistration.Dispose(); if (canceled) { core.TrySetCanceled(cancellationToken); @@ -158,44 +158,84 @@ namespace Cysharp.Threading.Tasks } } - static void CancellationCallback(object state) + void OnUpdate() { - var self = (TweenConfiguredSource)state; + originalUpdateAction?.Invoke(); - switch (self.cancelBehaviour) + if (!cancellationToken.IsCancellationRequested) + { + return; + } + + switch (this.cancelBehaviour) { case TweenCancelBehaviour.Kill: default: - self.tween.Kill(false); + this.tween.Kill(false); break; case TweenCancelBehaviour.KillAndCancelAwait: - self.canceled = true; - self.tween.Kill(false); + this.canceled = true; + this.tween.Kill(false); break; case TweenCancelBehaviour.KillWithCompleteCallback: - self.tween.Kill(true); + this.tween.Kill(true); break; case TweenCancelBehaviour.KillWithCompleteCallbackAndCancelAwait: - self.canceled = true; - self.tween.Kill(true); + this.canceled = true; + this.tween.Kill(true); break; case TweenCancelBehaviour.Complete: - self.tween.Complete(false); + this.tween.Complete(false); break; case TweenCancelBehaviour.CompleteAndCancelAwait: - self.canceled = true; - self.tween.Complete(false); + this.canceled = true; + this.tween.Complete(false); break; case TweenCancelBehaviour.CompleteWithSeqeunceCallback: - self.tween.Complete(true); + this.tween.Complete(true); break; case TweenCancelBehaviour.CompleteWithSeqeunceCallbackAndCancelAwait: - self.canceled = true; - self.tween.Complete(true); + this.canceled = true; + this.tween.Complete(true); + break; + case TweenCancelBehaviour.CancelAwait: + this.tween.onKill = EmptyTweenCallback; // replace to empty(avoid callback after Canceled(instance is returned to pool.) + this.core.TrySetCanceled(this.cancellationToken); + break; + } + } + + static void DoCancelBeforeCreate(Tween tween, TweenCancelBehaviour tweenCancelBehaviour) + { + + switch (tweenCancelBehaviour) + { + case TweenCancelBehaviour.Kill: + default: + tween.Kill(false); + break; + case TweenCancelBehaviour.KillAndCancelAwait: + tween.Kill(false); + break; + case TweenCancelBehaviour.KillWithCompleteCallback: + tween.Kill(true); + break; + case TweenCancelBehaviour.KillWithCompleteCallbackAndCancelAwait: + tween.Kill(true); + break; + case TweenCancelBehaviour.Complete: + tween.Complete(false); + break; + case TweenCancelBehaviour.CompleteAndCancelAwait: + tween.Complete(false); + break; + case TweenCancelBehaviour.CompleteWithSeqeunceCallback: + tween.Complete(true); + break; + case TweenCancelBehaviour.CompleteWithSeqeunceCallbackAndCancelAwait: + tween.Complete(true); break; case TweenCancelBehaviour.CancelAwait: - self.tween.onKill = EmptyTweenCallback; // replace to empty(avoid callback after Caceled(instance is returned to pool.) - self.core.TrySetCanceled(self.cancellationToken); break; } } @@ -212,7 +252,6 @@ namespace Cysharp.Threading.Tasks } } - public UniTaskStatus GetStatus(short token) { return core.GetStatus(token); @@ -232,8 +271,11 @@ namespace Cysharp.Threading.Tasks { TaskTracker.RemoveTracking(this); core.Reset(); + tween.onUpdate = originalUpdateAction; + tween.onKill = null; tween = default; cancellationToken = default; + originalUpdateAction = default; return pool.TryPush(this); } diff --git a/src/UniTask/Assets/Scenes/SandboxMain.cs b/src/UniTask/Assets/Scenes/SandboxMain.cs index 9a08762..916064b 100644 --- a/src/UniTask/Assets/Scenes/SandboxMain.cs +++ b/src/UniTask/Assets/Scenes/SandboxMain.cs @@ -15,6 +15,7 @@ using UnityEngine.LowLevel; using UnityEngine.Networking; using UnityEngine.UI; + // using DG.Tweening; public struct MyJob : IJob @@ -302,9 +303,17 @@ public class SandboxMain : MonoBehaviour } - async UniTaskVoid Start() + void Start() { - await UniTask.SwitchToMainThread(); + //_ = UniTask.Run(async () => + //{ + // var watch = System.Diagnostics.Stopwatch.StartNew(); + // await UniTask.Delay(new TimeSpan(0, 0, seconds: 10)); + // Debug.Log(watch.Elapsed); + //}); + + //return; + //await UniTask.SwitchToMainThread(); //UniTaskAsyncEnumerable.EveryValueChanged(mcc, x => x.MyProperty) // .Do(_ => { }, () => Debug.Log("COMPLETED")) @@ -315,10 +324,29 @@ public class SandboxMain : MonoBehaviour // .Forget(); //_ = Test1(); - Test2().Forget(); + //Test2().Forget(); //StartCoroutine(Test3("https://bing.com/")); + + + + //bool flip = false; + //var rect = cancelButton.GetComponent(); + //var cts = new CancellationTokenSource(); + //var ct = cts.Token; + //okButton.onClick.AddListener(UniTask.UnityAction(async () => + //{ + // await rect.DOMoveX(10f * (flip ? -1 : 1), 3).OnUpdate(() => { Debug.Log("UPDATE YEAH"); }).WithCancellation(ct); + // flip = !flip; + // // ok. + //})); + //cancelButton.onClick.AddListener(() => + //{ + // cts.Cancel(); + //}); + + // DG.Tweening.Core.TweenerCore //Debug.Log("GO MOVEX"); //await okButton.GetComponent().DOMoveX(-10.2f, 3).WithCancellation(CancellationToken.None); @@ -329,7 +357,7 @@ public class SandboxMain : MonoBehaviour //await okButton.GetComponent().DOMoveY(10.2f, 3).WithCancellation(CancellationToken.None); //Debug.Log("AGAIN END MOVE"); - Debug.Log(Test().GetType().FullName); + //Debug.Log(Test().GetType().FullName); @@ -383,16 +411,10 @@ public class SandboxMain : MonoBehaviour //{ - okButton.onClick.AddListener(UniTask.UnityAction(async () => - { - await UniTask.Yield(); - Debug.Log("Yeha"); - })); - - foreach (var (type, size) in TaskPool.GetCacheSizeInfo()) - { - Debug.Log(type + ":" + size); - } + //foreach (var (type, size) in TaskPool.GetCacheSizeInfo()) + //{ + // Debug.Log(type + ":" + size); + //} //}).Forget(); @@ -410,7 +432,7 @@ public class SandboxMain : MonoBehaviour //await UniTask.Delay(TimeSpan.FromSeconds(1)); - _ = ReturnToMainThreadTest(); + // _ = ReturnToMainThreadTest(); //GameObject.Destroy(this.gameObject);