Vector3 MoveTowards не делает работу? - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь переместить четыре объекта и плеер 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 Ответ

0 голосов
/ 29 марта 2019

Из документации 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;
    }
}
...