Skip to content

Commit

Permalink
Merge pull request #485 from Cysharp/hadashiA/fix-dotween
Browse files Browse the repository at this point in the history
Fix a problem in dotween where an extra update would run after canceling
  • Loading branch information
hadashiA committed Sep 8, 2023
2 parents f203b6c + afe5f57 commit 47a3f09
Showing 1 changed file with 68 additions and 86 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -144,22 +144,19 @@ static TweenConfiguredSource()
}

readonly TweenCallback onCompleteCallbackDelegate;
readonly TweenCallback onUpdateDelegate;

Tween tween;
TweenCancelBehaviour cancelBehaviour;
CancellationToken cancellationToken;
CallbackType callbackType;
bool canceled;

TweenCallback originalUpdateAction;
TweenCallback originalCompleteAction;
UniTaskCompletionSourceCore<AsyncUnit> core;

TweenConfiguredSource()
{
onCompleteCallbackDelegate = OnCompleteCallbackDelegate;
onUpdateDelegate = OnUpdate;
}

public static IUniTaskSource Create(Tween tween, TweenCancelBehaviour cancelBehaviour, CancellationToken cancellationToken, CallbackType callbackType, out short token)
Expand All @@ -179,17 +176,8 @@ public static IUniTaskSource Create(Tween tween, TweenCancelBehaviour cancelBeha
result.cancelBehaviour = cancelBehaviour;
result.cancellationToken = cancellationToken;
result.callbackType = callbackType;

result.originalUpdateAction = tween.onUpdate;
result.canceled = false;

if (result.originalUpdateAction == result.onUpdateDelegate)
{
result.originalUpdateAction = null;
}

tween.onUpdate = result.onUpdateDelegate;

switch (callbackType)
{
case CallbackType.Kill:
Expand Down Expand Up @@ -219,12 +207,79 @@ public static IUniTaskSource Create(Tween tween, TweenCancelBehaviour cancelBeha
default:
break;
}

if (result.originalCompleteAction == result.onCompleteCallbackDelegate)
{
result.originalCompleteAction = null;
}

if (cancellationToken.CanBeCanceled)
{
cancellationToken.RegisterWithoutCaptureExecutionContext(x =>
{
var source = (TweenConfiguredSource)x;
switch (source.cancelBehaviour)
{
case TweenCancelBehaviour.Kill:
default:
source.tween.Kill(false);
break;
case TweenCancelBehaviour.KillAndCancelAwait:
source.canceled = true;
source.tween.Kill(false);
break;
case TweenCancelBehaviour.KillWithCompleteCallback:
source.tween.Kill(true);
break;
case TweenCancelBehaviour.KillWithCompleteCallbackAndCancelAwait:
source.canceled = true;
source.tween.Kill(true);
break;
case TweenCancelBehaviour.Complete:
source.tween.Complete(false);
break;
case TweenCancelBehaviour.CompleteAndCancelAwait:
source.canceled = true;
source.tween.Complete(false);
break;
case TweenCancelBehaviour.CompleteWithSequenceCallback:
source.tween.Complete(true);
break;
case TweenCancelBehaviour.CompleteWithSequenceCallbackAndCancelAwait:
source.canceled = true;
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.core.TrySetCanceled(source.cancellationToken);
break;
}
}, result);
}

TaskTracker.TrackActiveTask(result, 3);

token = result.core.Version;
Expand Down Expand Up @@ -255,77 +310,6 @@ void OnCompleteCallbackDelegate()
}
}

void OnUpdate()
{
originalUpdateAction?.Invoke();

if (!cancellationToken.IsCancellationRequested)
{
return;
}

switch (this.cancelBehaviour)
{
case TweenCancelBehaviour.Kill:
default:
this.tween.Kill(false);
break;
case TweenCancelBehaviour.KillAndCancelAwait:
this.canceled = true;
this.tween.Kill(false);
break;
case TweenCancelBehaviour.KillWithCompleteCallback:
this.tween.Kill(true);
break;
case TweenCancelBehaviour.KillWithCompleteCallbackAndCancelAwait:
this.canceled = true;
this.tween.Kill(true);
break;
case TweenCancelBehaviour.Complete:
this.tween.Complete(false);
break;
case TweenCancelBehaviour.CompleteAndCancelAwait:
this.canceled = true;
this.tween.Complete(false);
break;
case TweenCancelBehaviour.CompleteWithSequenceCallback:
this.tween.Complete(true);
break;
case TweenCancelBehaviour.CompleteWithSequenceCallbackAndCancelAwait:
this.canceled = true;
this.tween.Complete(true);
break;
case TweenCancelBehaviour.CancelAwait:
// restore to original callback
switch (callbackType)
{
case CallbackType.Kill:
tween.onKill = originalCompleteAction;
break;
case CallbackType.Complete:
tween.onComplete = originalCompleteAction;
break;
case CallbackType.Pause:
tween.onPause = originalCompleteAction;
break;
case CallbackType.Play:
tween.onPlay = originalCompleteAction;
break;
case CallbackType.Rewind:
tween.onRewind = originalCompleteAction;
break;
case CallbackType.StepComplete:
tween.onStepComplete = originalCompleteAction;
break;
default:
break;
}

this.core.TrySetCanceled(this.cancellationToken);
break;
}
}

static void DoCancelBeforeCreate(Tween tween, TweenCancelBehaviour tweenCancelBehaviour)
{

Expand Down Expand Up @@ -392,7 +376,6 @@ bool TryReturn()
{
TaskTracker.RemoveTracking(this);
core.Reset();
tween.onUpdate = originalUpdateAction;

switch (callbackType)
{
Expand Down Expand Up @@ -420,7 +403,6 @@ bool TryReturn()

tween = default;
cancellationToken = default;
originalUpdateAction = default;
originalCompleteAction = default;
return pool.TryPush(this);
}
Expand Down

0 comments on commit 47a3f09

Please sign in to comment.