Demigiant / dotween

A Unity C# animation engine. HOTween v2
http://dotween.demigiant.com
Other
2.33k stars 348 forks source link

OnComplete callback called twice when triggered from OnUpdate #547

Open mikatu opened 2 years ago

mikatu commented 2 years ago

Hey, I use the code below to allow users skip animations.

var tw = transform.DOLocalMove(new Vector3(), 10);
tw.OnStart(() => Debug.Log("Started"));
tw.OnComplete(() => Debug.Log("Completed"));
tw.OnUpdate(() => {
    if (Input.GetMouseButtonDown(0))
        tw.Complete(true);
    }
);

This causes OnComplete to trigger twice in v1.2.632

rafael-f commented 1 year ago

The following code also fires OnComplete twice, it's also fired from OnUpdate but using Kill(true) instead....

    public void dotest()
    {
        Sequence sequence = DOTween.Sequence();

        int updatecount = 0;
        int completecalls = 0;
        int onkillcount = 0;
        int endFrame = Time.frameCount + 1;

        sequence.AppendInterval(2)
            .OnUpdate(() => {
                ++updatecount;
                Debug.Log($"called OnUpdate {updatecount}");
                sequence.Kill(complete: true);
            })
            .OnComplete(() => {
                ++completecalls;
                Debug.Log($"complete called {completecalls} update called {updatecount}");
            })
            .OnKill(() => {
                onkillcount++;
                Debug.Log($"called OnKill {onkillcount}");
            })
            .SetUpdate(UpdateType.Normal, isIndependentUpdate: true)
            .SetAutoKill(true);

        sequence.Play();
    }
surmwill commented 1 month ago

Here is some simpler code:

_sequence = DOTween.Sequence();
_sequence.AppendInterval(2f)
    .OnUpdate(() => _sequence.Kill(true))
    .OnComplete(() => Debug.Log($"COMPLETE {_sequence.IsActive()}"));

Output:

COMPLETE true
COMPLETE false

sequence.Kill(true) triggers the first OnComplete with the sequence still active. Now completed, the second OnComplete runs naturally, but with an inactive sequence.