如何在 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 的方法(这没有明显的视觉副作用,所以我在调试之前没有注意到),但是我只是杀了最后一个序列。
所以事件的顺序是:
- 使用 Sequence mySequence = DOTween.Sequence();
创建一个序列
- (错误地)通过再次调用同一行创建另一个序列。这导致较早的 mySequence 引用被 class.
“覆盖”、“丢失”或“未知”
- 调用mySequence.Kill(); (这会杀死在 2 中创建的 mySequence)
- 在 1 中创建的 mySequence 现在就像一个僵尸。没有什么能找到它并杀死它。
如果这是一个常规补间,一种“核”修复方法是调用 DOTween.KillAll();但据我所知,它不适用于序列,而且它会杀死你可能不想要的每个补间。
所以有2个选项:
确保在终止之前只创建一个 mySequence。杀死它后,您可以创建另一个同名的。这种方法可行,但存在多次错误调用相同创建方法的风险。
确保你的场景中同时有一个 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;
}
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 的方法(这没有明显的视觉副作用,所以我在调试之前没有注意到),但是我只是杀了最后一个序列。
所以事件的顺序是:
- 使用 Sequence mySequence = DOTween.Sequence(); 创建一个序列
- (错误地)通过再次调用同一行创建另一个序列。这导致较早的 mySequence 引用被 class. “覆盖”、“丢失”或“未知”
- 调用mySequence.Kill(); (这会杀死在 2 中创建的 mySequence)
- 在 1 中创建的 mySequence 现在就像一个僵尸。没有什么能找到它并杀死它。
如果这是一个常规补间,一种“核”修复方法是调用 DOTween.KillAll();但据我所知,它不适用于序列,而且它会杀死你可能不想要的每个补间。
所以有2个选项:
确保在终止之前只创建一个 mySequence。杀死它后,您可以创建另一个同名的。这种方法可行,但存在多次错误调用相同创建方法的风险。
确保你的场景中同时有一个 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; }