如何在 Unity3d 中终止当前 运行 DoTween 序列?

How to kill current running DoTween sequence in Unity3d?

DOTween.Kill api return 实际杀死的补间数。但是使用这个 api 不能杀死变换的补间序列。

DOTween.Kill(这个);或 DOTween.Kill(转换);还是DOTween.Rewindapi都杀不死

那是因为您正在尝试使用 DoTween class 本身。相反,您应该使用对序列的引用来终止它。

下面的代码

Sequence mySequence = DOTween.Sequence();

//Your code here  
mySequence.Append(transform.DoMove(Vector3.right, 1).SetLoops(2, LoopType.Yoyo))  
.Append(transform.DoMove(Vector3.up, 1).SetLoops(2, LoopType.Yoyo))  
.OnComplete(() => {  
    Debug.Log("Done");
});

mySequence.Kill(); //Kill the sequence.

在我的例子中sequence.Kill()不起作用,所以我尝试了Dotween.Kill(object targetOrId),它起作用了,也许你可以试试。

在我的例子中,对序列的引用丢失了,因此 mySequence.Kill();无法找到并终止序列。

发生这种情况的原因是,我从我的代码的两个不同部分重复调用播放 mySequence 的方法(这没有明显的视觉副作用,所以我在调试之前没有注意到),但是我只是杀了最后一个序列。

所以事件的顺序是:

  1. 使用 Sequence mySequence = DOTween.Sequence();
  2. 创建一个序列
  3. (错误地)通过再次调用同一行创建另一个序列。这导致较早的 mySequence 引用被 class.
  4. “覆盖”、“丢失”或“未知”
  5. 调用mySequence.Kill(); (这会杀死在 2 中创建的 mySequence)
  6. 在 1 中创建的 mySequence 现在就像一个僵尸。没有什么能找到它并杀死它。

如果这是一个常规补间,一种“核”修复方法是调用 DOTween.KillAll();但据我所知,它不适用于序列,而且它会杀死你可能不想要的每个补间。

所以有2个选项:

  1. 确保在终止之前只创建一个 mySequence。杀死它后,您可以创建另一个同名的。这种方法可行,但存在多次错误调用相同创建方法的风险。

  2. 确保你的场景中同时有一个 mySequence。这可以通过单例模式的方法实现。

    private Sequence sequence;
    private Guid uid;
    
    private void StartScalingAnimation()
    {            
        if (sequence == null) // only create if there was none before.
        {
            sequence = DOTween.Sequence();
            sequence.Append(transform.DOScale(new Vector2(1.1f, 1.1f), 1)).SetLoops(-1, LoopType.Yoyo);
            Debug.Log("sequence id is:" + sequence.id); 
    
            //if your sequence gets an id upon creation, you can cache 
            //it and kill it later with that id. In my case, no id was 
            //given automatically at the start, so I created one.
    
            uid = System.Guid.NewGuid();
            sequence.id = uid;
            Debug.Log("sequence id now:" + sequence.id);
        }
    
        sequence.Play();            
    }
    
    private void StopScalingAnimation()
    {
        DOTween.Kill(uid);
        sequence = null;
    }