Vector3 MoveTowards не выполняет задание?

#c# #unity3d #qvector3d

#c# #unity3d #qvector3d

Вопрос:

Я пытаюсь переместить четыре объекта и проигрыватель 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. Как вы вызываете этот ZoomObject метод. Это вызывается только один раз?

2. Вам нужно вызвать это в цикле, иначе оно будет выполнено только один раз

Ответ №1:

Из документации Unity:

https://docs.unity3d.com/ScriptReference/Vector3.MoveTowards.html

Вычислите положение между точками, указанными current и target, перемещаясь не дальше расстояния, указанного 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;
    }
}