使用Time.deltaTime进行时会发生什么?

时间:2019-02-15 05:59:03

标签: c# unity3d time lerp

我最近刚刚被介绍给Time.deltaTime并受其困扰,在过去的几天里一直处于困境。

因此,当我在最后一个Time.deltaTime插入float并乘以另一个称为speed的float变量时,究竟是什么情况? Time.deltaTimespeed给出最终结果的每一帧都做了什么?

谢谢!

public class CameraMovement : MonoBehaviour
{
    public GameObject followTarget;
    public float moveSpeed;

    void Update()
    {
        if (followTarget != null)
        {
            transform.position = Vector3.Lerp(transform.position, followTarget.transform.position, moveSpeed * Time.deltaTime); 
        } 
    }
}

2 个答案:

答案 0 :(得分:2)

Vector3.Lerp期望一个介于01之间的因数,然后对这两个位置进行插值

  • 0的意思是transform.position
  • 1的意思是followTarget.transform.position

在它们之间的插值之间的任何其他值意味着类似

transform.position + (followTarget.transform.position - transform.position) * factor;

Time.deltaTime = time past since last frame rendered,因此最有可能接近0.017的值(对于60FPS)。您可以自己计算moveSpeed * 0.017的平均价值。


您实际上正在寻找的是Vector3.MoveTowards

void Update()
{
    if (followTarget != null)
    {
        transform.position = Vector3.MoveTowards(transform.position, followTarget.transform.position, moveSpeed * Time.deltaTime); 
    }   
}

答案 1 :(得分:0)

在Lerp中使用Time.deltaTime * scalar很好,但这不是使用它的“预期”方式。

LERP的意思是“线性intERPolation”。使用此数学工具,您可以使用线性函数(y = ax + b)和0至1之间的系数t在两个其他值之间内插

假设您试图在两个其他位置(A和B)之间找到位置(C)(例如您的问题),则您具有以下图形:

alt text

1°),如果初始位置和目标位置没有变化,并且参数t在0和1之间变化,则运动曲线将是完全笔直的:速度将随时间变化。

transform.position = Vector2.Lerp(InitialPosition, DestinationPosition, t ); // t from 0 to 1

2°)但是,由于t(几乎)不随时间变化(使用Time.deltaTime),而是改变A的位置,因此运动会随着时间而减速,因为您采用固定的百分比每次剩余的距离。由于距离会随着时间的推移而减小,因此您也会随着时间的推移而减少行程

transform.position = Vector2.Lerp(transform.position, DestinationPosition, 0.017 ); // 0.017, approx of Time.deltaTime at 60FPS

alt text