Unity DoTween DoFade等Do函数需要注意的问题(已修改)

一.、Do函数只需要执行一次

      实际上,Do函数不需要放在Update中每帧执行只需要执行一次就行,比如:

void Start()
    {

       transform.DOLocalMove(new Vector3(0, 0, -5), 5f);
    }

 如果在Update中一直执行DOLocalMove,你可能会看到下面这个自动扩容提示,同时你会看到帧数也在不断下降:

这是因为每执行一次DOLocalMove操作,都会创建一个新的进程,导致重复堆积

总结:Do操作只需要执行一次!!!

但是Lerp相反,Lerp需要放在Update中每帧执行,比如:

 void Update()
    {
        transform.position = Vector3.Lerp(transform.position, new Vector3(0, 0, -5), 0.2f);
    }

二者效果差不多

这也是我之前搞混的地方,以为DOLocalMove也要放在Update中一直执行。。。。。。

二、时间参数和实际执行时间不一致,还是以上面的物体移动为例:

实际耗费时间通过下面这些函数计算:

 float StartTime,EndTime;
 bool once,First;

 void Start()
    {
        StartTime = 0f;
        EndTime = 0f;
        once = true;
        First = true;
    }
    void Update()
    {
        if (First)
        {
            transform.DOLocalMove(new Vector3(0, 0, -5), 5f);
            StartTime = Time.time;
            First = false;
        }


        if (transform.position.z == -5&&once)
        {
            transform.DOKill();
            EndTime = Time.time;
            var cost = EndTime - StartTime;
            Debug.Log("所耗时间为:"+cost+"s");
            once = false;
        }
        
    }

结果如下:

实际效果:可以看到,从(0,0,0)移动到(0,0,-5)总共花了5秒左右,符合预期

实际执行时间:    一直执行,远远大于5秒,理论上是无限长时间,永远不会自动停止

解决方法,仍以上面为例:

1.通过DoKill结束DO进程,如:
        if (transform.position.z == -5)
        {
            transform.DOKill();
        }

2.定义Tween变量t,用 t = DOTween.To()进行过渡操作,并用 t.kill()结束DO进程;

3.若要实现匀速+固定时间(近似),可以参考我的文章:

Unity Lerp实现近似匀速过渡固定步长,而非由快到慢的当前比值_psp之魂的博客-CSDN博客

三、使用DoFade等操作时,确保游戏速度Time.timeScale不为0。比如我个人遇到的一个问题:当我打开UI菜单时设置了Time.timeScale=0,因此之后所有的DoFade操作(比如用Do对UI图标进行大小变化、颜色变化)都无效,直到恢复游戏速度。

猜你喜欢

转载自blog.csdn.net/qianhang120/article/details/128703110