[Unity] DOTween 没有返回期望的精确起始值的 Debug 方法

417 阅读2分钟

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));