From be8dbe880433fe06d9380ee85cfd0d5d074fbf3c Mon Sep 17 00:00:00 2001 From: hadashiA Date: Wed, 20 Sep 2023 17:35:04 +0900 Subject: [PATCH 1/2] Fixed a bug in Dotween after returning to the pool of CancellationToken.Register --- .../Runtime/External/DOTween/DOTweenAsyncExtensions.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs index 076bed5..3a545be 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs @@ -148,6 +148,7 @@ namespace Cysharp.Threading.Tasks Tween tween; TweenCancelBehaviour cancelBehaviour; CancellationToken cancellationToken; + CancellationTokenRegistration cancellationRegistration; CallbackType callbackType; bool canceled; @@ -207,7 +208,7 @@ namespace Cysharp.Threading.Tasks default: break; } - + if (result.originalCompleteAction == result.onCompleteCallbackDelegate) { result.originalCompleteAction = null; @@ -215,7 +216,7 @@ namespace Cysharp.Threading.Tasks if (cancellationToken.CanBeCanceled) { - cancellationToken.RegisterWithoutCaptureExecutionContext(x => + result.cancellationRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(x => { var source = (TweenConfiguredSource)x; switch (source.cancelBehaviour) @@ -376,6 +377,7 @@ namespace Cysharp.Threading.Tasks { TaskTracker.RemoveTracking(this); core.Reset(); + cancellationRegistration.Dispose(); switch (callbackType) { From 3ed28e534aa0153e320ffc5c85f78168eb449eaf Mon Sep 17 00:00:00 2001 From: hadashiA Date: Thu, 21 Sep 2023 10:00:27 +0900 Subject: [PATCH 2/2] Tweaks --- .../DOTween/DOTweenAsyncExtensions.cs | 40 +++++-------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs index 3a545be..ba78367 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/External/DOTween/DOTweenAsyncExtensions.cs @@ -251,30 +251,7 @@ namespace Cysharp.Threading.Tasks source.tween.Complete(true); break; case TweenCancelBehaviour.CancelAwait: - // restore to original callback - switch (callbackType) - { - case CallbackType.Kill: - tween.onKill = source.originalCompleteAction; - break; - case CallbackType.Complete: - tween.onComplete = source.originalCompleteAction; - break; - case CallbackType.Pause: - tween.onPause = source.originalCompleteAction; - break; - case CallbackType.Play: - tween.onPlay = source.originalCompleteAction; - break; - case CallbackType.Rewind: - tween.onRewind = source.originalCompleteAction; - break; - case CallbackType.StepComplete: - tween.onStepComplete = source.originalCompleteAction; - break; - default: - break; - } + source.RestoreOriginalCallback(); source.core.TrySetCanceled(source.cancellationToken); break; } @@ -379,6 +356,16 @@ namespace Cysharp.Threading.Tasks core.Reset(); cancellationRegistration.Dispose(); + RestoreOriginalCallback(); + + tween = default; + cancellationToken = default; + originalCompleteAction = default; + return pool.TryPush(this); + } + + void RestoreOriginalCallback() + { switch (callbackType) { case CallbackType.Kill: @@ -402,11 +389,6 @@ namespace Cysharp.Threading.Tasks default: break; } - - tween = default; - cancellationToken = default; - originalCompleteAction = default; - return pool.TryPush(this); } } }