unity:使协程不受帧率干扰的影响

(个人记录,记得很随便)

提出问题
这是一个unity的协程方法,可以物体从小到大平滑过渡缩放
很简单的,小学二年级都可以写出来
private IEnumerator Scale(float speed)
{
transform.localScale = Vector3.zero;
while (localScale.magnitude - transform.localScale.magnitude > 0.01f)
{
float y = Mathf.SmoothStep(transform.localScale.y, localScale.y, Time.fixedDeltaTime * speed);
transform.localScale = new Vector3(localScale.x, y, localScale.z);
yield return 0;
}
}
实操发现,这个协程会受到游戏帧率的影响
我尝试修复,接连尝试了deltaTime、fixedTime、unscaledTime、fixedUnscaledTime都无济于事(修了一上午)

解决问题
后面,我与ChatGPT想到了一个绝妙的方法:
可以考虑使用实际时间(例如使用Time.time)进行缩放过渡,而不是依赖于帧率!!
这是最终的代码,效果非常好:
private IEnumerator Scale(float speed)
{
transform.localScale = Vector3.zero;
float startTime = Time.time;
float duration = (localScale.magnitude - transform.localScale.magnitude) / speed;
while (Time.time - startTime < duration)
{
float t = (Time.time - startTime) / duration;
float y = Mathf.SmoothStep(0f, localScale.y, t);
transform.localScale = new Vector3(localScale.x, y, localScale.z);
yield return null;
}
transform.localScale = localScale;
}