Vector3 MoveTowards не делает работу?
Я пытаюсь переместить четыре объекта и плеер SteamVR, обновив transform.position. Это прекрасно работает, но выглядит не очень хорошо, потому что движение похоже на мгновение. Вот почему я хочу использовать Vector3.MoveTowards().
Каким-то образом код ниже не делает работу. Я надеялся, что кто-нибудь сможет мне помочь.
private void ZoomObject(Vector3 currentPlayerPosition, float height, float distance)
{
TPNorthObject.transform.position = Vector3.MoveTowards(TPNorthObject.transform.position, new Vector3(0, height, distance), 10 * Time.deltaTime);
TPEastObject.transform.position = Vector3.MoveTowards(TPEastObject.transform.position, new Vector3(distance, height, 0), 10 * Time.deltaTime);
TPSouthObject.transform.position = Vector3.MoveTowards(TPSouthObject.transform.position, new Vector3(0, height, -distance), 10 * Time.deltaTime);
TPWestObject.transform.position = Vector3.MoveTowards(TPWestObject.transform.position, new Vector3(-distance, height, 0), 10 * Time.deltaTime);
}
Я ожидал, что объект переместится на новое векторное место. Однако, похоже, это не так.
Может кто-нибудь дать мне некоторое понимание или совет?
заранее спасибо
1 ответ
Из документации Unity:
https://docs.unity3d.com/ScriptReference/Vector3.MoveTowards.html
Вычислить позицию между точками, указанными в текущей и целевой точках, не двигаясь дальше расстояния, указанного в maxDistanceDelta.
Используйте элемент MoveTowards для перемещения объекта в текущей позиции в направлении целевой позиции. Обновляя положение объекта в каждом кадре, используя положение, рассчитанное этой функцией, вы можете плавно перемещать его к цели. Управляйте скоростью движения с помощью параметра maxDistanceDelta.
То есть MoveTowards не делает плавную анимацию за вас. Если вы не хотите какой-либо анимационный эффект, ваша функция ZoomObject должна вызываться в цикле, пока ваш объект не достигнет целевой позиции. Посмотрите пример на странице документации.
Вы можете использовать цикл или сопрограмму, чтобы сделать это. Может быть, что-то похожее на это.
IEnumerator Fade()
{
while (Vector3.Distance(TPNorthObject.transform.position, new Vector3(0, height, distance)) > 0.001f)
{
// Speed = Distance / Time => Distance = speed * Time. => Adapt the speed if move is instant.
TPNorthObject.transform.position = Vector3.MoveTowards(TPNorthObject.transform.position, new Vector3(0, height, distance), 10 * Time.deltaTime);
yield return null;
}
}