在Unity中,. movetowards达到距离的平方为0,但. lerp没有.为什么

本文关键字:lerp 为什么 没有 Unity movetowards 距离 | 更新日期: 2023-09-27 18:17:51

下面是我的更新函数:

public void Update()
{
    if (Type == FollowType.MoveTowards)
        transform.position = Vector3.MoveTowards(transform.position, _currentPoint.Current.position, Time.deltaTime * Speed);
    if (Type == FollowType.Lerp)
        transform.position = Vector3.Lerp(transform.position, _currentPoint.Current.position, Time.deltaTime * Speed);
    // Move _currentPoint to next point
    if(Input.GetKeyUp(KeyCode.Space))
    {
        var distanceSquared = (transform.position - _currentPoint.Current.position).sqrMagnitude;
        if (distanceSquared == 0)
            _currentPoint.MoveNext();
    }
}

我正在移动两个对象,一个使用.MoveTowards,另一个使用.Lerp

我允许它们在按空格时移动到下一个位置,并且它们到到达位置的距离的平方等于0。.MoveTowards对此没有问题,但.Lerp似乎从未达到距离的平方0,因此不允许对象移动到下一个位置。

但是如果我使用空白,我可以让.Lerp工作,当然包括.MoveTowards

的例子:

        if (distanceSquared < .1f * .1f)
            _currentPoint.MoveNext();

为什么我需要使用这个边距?我看到别人也这样做,但我仍然没有领会这个概念。

我很感激任何关于这件事的知识!谢谢。

在Unity中,. movetowards达到距离的平方为0,但. lerp没有.为什么

主要是因为这不是lerp 所做的。"线性插值"接受两个值并返回另一个值,该值介于它们之间的 t%。如果您从不传递一个0或1的t,那么您将永远不会在输出中看到任何一个端点。

通常,您可能会传入一个随时间增加的t。例如,您可以有一个名为timer的浮点数,每帧增加Time.deltaTime:

float timer;
Vector3 startPosition = Vector3.zero;
Vector3 endPosition = Vector3.up * 10f;
//move from "startPosition" to "endPosition" over 20 seconds
void Update() {
    timer += Time.deltaTime;
    transform.position = Vector3.Lerp(startPosition, endPosition, timer / 20f);
}

在您的情况下,您保持t或多或少不变。它大概等于Speed乘以0.02。通过反复移动startPositionendPosition,您将产生一种有趣的缓和效果——因为您的输出总是会更接近10%——但这也是为什么您的输出永远不会达到其目制值。