DOTween 本身一般不会出错……?例如如下用于测试 DOPunchScale 的代码
using System.Collections;
using DG.Tweening;
using UnityEngine;
public class TestDOPunch : MonoBehaviour
{
private void Start()
{
StartCoroutine(TestFunc());
}
public IEnumerator TestFunc()
{
yield return new WaitForSeconds(5f);
transform.DOPunchScale(new Vector3(0.1f, 0.1f, 0.1f), 0.5f, 1, 0f);
}
}
可以在监视器中看到,在 DOPunchScale 完成之后,物体的 size 会返回精确的 (1, 1, 1)
那么如果你的 DOPunchScale 完成之后没有返回期望的精确的值:
在执行某 Tween 之前先 Kill 掉其他的 Tween
你可以在创建 Tween 或者 Sequence 之前执行 DOTween.KillAll(true); 这样可以防止其他正在运行的 Tween 和 Sequence 的干扰
检查 Tween 运行前的初始值是否是期望的初始值
如果你发现在运行某 DOTween 之间 kill 了所有的 Tween 也仍然有 bug,那么可能是你的 Tween 或者 Sequence 在创建的时候获取到的初始值就不是你所期望的初始值
我的一个真实的 debug 经历就是这样。我的功能是,拖动一个物体,物体在开始被拖动的时候会变大,然后被松开的时候会缩小回 transform.localScale = (1, 1, 1)
但是我同时又有一个功能,是在某个物体被松开的时候,判断是否能跟周围物体进行一个操作,能操作的话这个被松开的物体就会 DOPunchScale 一下,然后我期望这个 DOPunchScale 结束时物体会缩小回 transform.localScale = (1, 1, 1)
实际上有一个可能是,我松开之后就开始判断了,所以判断结束时物体还没有缩小回 (1, 1, 1) 就开始 DOPunchScale 了,那么 DOPunchScale 的获取的初始值就不是 (1, 1, 1) 了,那么 punch 之后自然也不会返回 (1, 1, 1)
例如你可以这样来 Debug
Sequence mySeq = DOTween.Sequence();
... //init mySeq
print(string.Format("Before:{0}",transform.localScale));
mySeq.Play();
yield return mySeq.WaitForCompletion();
print(string.Format("After:{0}",transform.localScale));
DOPunchScale 等 Tween 确实可能返回不精确的值
我在实践中确实遇到了这样的情况,有时有,有时没有,不知道是怎么回事,毕竟是黑盒子
例如:
DOTween.KillAll(true);
transform.localScale = Vector3.one;
Sequence mySeq = DOTween.Sequence();
... //init mySeq
print(string.Format("Before:{0}",transform.localScale));
mySeq.Play();
yield return mySeq.WaitForCompletion();
print(string.Format("After:{0}",transform.localScale));
最终输出的 transform.localScale 也可能不是 1
那只好用一个变大一个变小的 sequence 代替了,比如我一开始想的是这样,但是这样得不到一个流畅的 punch
// 不要用 DOPunch! 有无法返回准确值的坑
mySeq.Insert(0.5f, transform.DOScale(Vector3.one * 1.1f, 0.3f));
mySeq.Insert(0.8f, transform.DOScale(Vector3.one, 0.2f));