Плавная анимация с Vector.moveTowards не работает? - PullRequest
0 голосов
/ 05 апреля 2019

Я уже задавал этот вопрос однажды, но до сих пор не понял, как решить эту проблему. Я пытаюсь изменить положение 4 игровых объектов единства и игрока SteamVR, изменив положение transform.position. Это работает очень хорошо, но выглядит не очень хорошо, потому что кажется, что вы мгновенно телепортируетесь в новое положение.

Итак, я хочу переместить объекты с помощью Vector3.MoveTowards. Но я пробовал несколько вещей, и это просто не работает. У меня были следующие ситуации с другим кодом: -> Объект даже не двигается -> Объект движется мгновенно

В настоящее время я использую следующее.

Метод обновления:

private void Update()
{
    if (Condition)
    {
        ZoomIn();
    }
}

Метод Zoomin:

private void ZoomIn()
{
    switch (ZoomLevel)
    {
        case 1:
            SetZoomLevel(20, 40);
            ZoomLevel++;
            break;
        case 2:
            SetZoomLevel(40, 60);
            ZoomLevel++;
            break;
        case 3:
            break;
    }
}

SetZoomLevel (где фактически начинается движение, и где проблема):

private void SetZoomLevel(float height, float distance)
{
    Fade(ObjectToMove1, height, distance);
    Fade(ObjectToMove2, height, distance);
    Fade(ObjectToMove3, height, distance);
    Fade(ObjectToMove4, height, distance);
}

Это должно вызвать анимацию

IEnumerator Fade(GameObject teleportObject, float height, float distance)
{
    while (Vector3.Distance(teleportObject.transform.position, new Vector3(0, height, distance)) > 0.001f)
    {
        // Speed = Distance / Time => Distance = speed * Time. => Adapt the speed if move is instant.
        teleportObject.transform.position = Vector3.MoveTowards(teleportObject.transform.position, new Vector3(0, height, distance), 10 * Time.deltaTime);

        yield return null;
    }
}

Почему-то это не работает.

Я надеюсь, что кто-нибудь может мне помочь.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Fade - сопрограмма, но вы не называете ее таковой, вместо нее следует использовать StartCoroutine().(См .: StartCoroutine ).Вы также можете использовать цикл for для ваших объектов, чтобы вы получили код:

private void SetZoomLevel(float height, float distance)
{
    foreach (GameObject obj in your_objects)
    {
        StartCoroutine(Fade(obj, height, distance));
    }
}

Теперь, что касается сопрограммы Fade(), я не вижу там ничего странного, если она все еще не движетсякак вы хотите, возможно, попробуйте изменить значение скорости (ваш 10 в третьем параметре MoveTowards).

1 голос
/ 05 апреля 2019

Я думаю, что ваше while утверждение должно быть if утверждением. Я думаю, что ваш код перемещает объект в его окончательную позицию в 1 кадр , за исключением того, что плавно перемещается по нескольким кадрам. Звонки на Vector3.MoveTowards должны происходить в разных кадрах.

Ваш Fade метод будет выглядеть так:

void Fade(GameObject teleportObject, float height, float distance)
{
    if (Vector3.Distance(teleportObject.transform.position, new Vector3(0, height, distance)) > 0.001f)
    {
        teleportObject.transform.position = Vector3.MoveTowards(teleportObject.transform.position, new Vector3(0, height, distance), 10 * Time.deltaTime);
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...