-2

我最近才被介绍给Time.deltaTimelerping 并且在过去的几天里一直被困住。

因此,当我插入Time.deltaTime最后一个float,然后乘以另一个名为 的浮点变量speed时,到底发生了什么?对给出最终结果的每一帧Time.deltaTime做了什么?speed

谢谢!!

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

2 回答 2

2

Vector3.Lerp0期望在和 之间有一个因子,1并对这两个位置进行插值,所以

  • 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); 
    }   
}
于 2019-02-15T06:31:20.253 回答
0

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

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

假设您试图在其他两个(A 和 B)(如您的问题)之间获得一个位置(C),您有以下绘图:

替代文字

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

替代文字

于 2019-02-15T10:28:48.137 回答