В Unity,.MoveTowards достигает квадрата расстояния в 0, но.Lerp этого не делает. Зачем?

93
6

Вот моя функция обновления:

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();

Зачем мне использовать эту маржу? Я видел, как и другие делают это, но я до сих пор не понял эту концепцию.

Я ценю любые знания по этому вопросу! Благодарю.

спросил(а) 2021-01-14T00:00:14+03:00 1 неделя назад
1
Решение
60

В основном потому, что это не то, что делает ерп. "Линейная интерполяция" принимает два значения и возвращает другое значение, которое составляет 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% ближе, - но это также точно, почему ваш выход никогда не достигает своего целевого значения.

ответил(а) 2021-01-14T00:00:14+03:00 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема