Unity DoTween DoFade等Do函数需要注意的问题(已修改)
这也是我之前搞混的地方,以为DOLocalMove也要放在Update中一直执行。实际效果:可以看到,从(0,0,0)移动到(0,0,-5)总共花了5秒左右,符合预期。2.定义Tween变量t,用 t = DOTween.To()进行过渡操作,并用。这是因为每执行一次DOLocalMove操作,都会创建一个新的进程,导致重复堆积。实际执行时间:一直执行,远远大于5秒,理论上是无限长时间,不需要放在
一.、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中一直执行。。。。。。
此外,创建的新Do不会覆盖旧的Do,两者并行,具体可以参考:
二、时间参数和实际执行时间基本一致,还是以上面的物体移动为例:
实际耗费时间通过下面这些函数计算:
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秒左右,符合预期
(2024-2-21修改)
似乎Do操作会自动结束,之前以为要手动 DoKill() 或 DOLocalMove().SetAutoKill()
但测了一下貌似又不会出现自动扩容提示..............
解决方法:
1.通过DoKill结束DO进程,如:
if (transform.position.z == -5)
{
transform.DOKill();
}
2.定义Tween变量t,用 t = DOTween.To()进行过渡操作,并用 t.kill()结束DO进程;
3.若要实现匀速或者其它过渡方式,可以通过 .SetEase()设置过渡方式,如下 :
transform.DOLocalMove(new Vector3(0, 0, -5), 5f).SetEase(Ease.Linear);
Ease.Linear:线性过渡=匀速
各种过渡方式效果参考:
Unity Dotween曲线介绍 Ease曲线 Ease图表 Ease效果示例-CSDN博客
4.Lerp的使用:
Unity Lerp实现近似匀速过渡固定步长,而非由快到慢的当前比值_psp之魂的博客-CSDN博客
三、使用Do操作时,可以通过SetUpdate(bool)设定速度是否受Time.timeScale的影响。比如:当打开UI菜单时设置了Time.timeScale=0,因此之后跟UI有关的Do操作(比如用Do对UI图标进行大小变化、颜色变化)都需要设定为与Time.timeScale无关,即: Do.SetUpdate(true)
更多推荐
所有评论(0)