В Unity,.MoveTowards достигает квадрата расстояния в 0, но.Lerp этого не делает. Зачем?
Вот моя функция обновления:
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();
Зачем мне использовать эту маржу? Я видел, как и другие делают это, но я до сих пор не понял эту концепцию.
Я ценю любые знания по этому вопросу! Благодарю.
В основном потому, что это не то, что делает ерп. "Линейная интерполяция" принимает два значения и возвращает другое значение, которое составляет t
процентов между ними. Если вы никогда не переходят в 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
перемещение startPosition
ближе к endPosition
, вы получите интересный эффект ослабления - потому что ваш вывод всегда будет, скажем, на 10% ближе, - но это также точно, почему ваш выход никогда не достигает своего целевого значения.