在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();
为什么我需要使用这个边距?我看到别人也这样做,但我仍然没有领会这个概念。
我很感激任何关于这件事的知识!谢谢。主要是因为这不是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
。通过反复移动startPosition
和endPosition
,您将产生一种有趣的缓和效果——因为您的输出总是会更接近10%——但这也是为什么您的输出永远不会达到其目制值。