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;
    }
}
Другие вопросы по тегам