Повернуть объект, чтобы указать направление в продолжительности в Unity? - PullRequest
0 голосов
/ 28 апреля 2020

Итак, на моей сцене у меня есть основной игровой объект и второй игровой объект, который служит ссылкой. Я хочу, чтобы основной игровой объект вращался так, чтобы он смотрел так же, как и второй игровой объект. И это вращение должно произойти в установленное время. Давайте предположим, что продолжительность составляет 3 секунды. Если второй игровой объект имеет мировое вращение 0, 90, 0, основной игровой объект начинает вращаться так, что через три секунды его вращение становится 0, 90, 0.

Итак, у меня есть Transforms of основной игровой объект и второй игровой объект, теперь мне нужно вычислить количество вращений за кадр, чтобы вращение происходило с правильной продолжительностью.

Я был бы очень признателен, если бы кто-то мог мне помочь! Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

Для этого вы можете использовать Slerp метод. Итак, в обновлении должно быть что-то вроде этого:

transform.rotation = Quaternion.Slerp(transform.rotation, secondTransform.rotation, rotationSpeed * Time.deltaTime);
0 голосов
/ 28 апреля 2020

https://answers.unity.com/questions/765197/how-do-i-rotate-an-object-over-a-set-time.html

Ответ для краткости:

 float totalRotationTime = 5.0f;
 float y_degreesPerSecond = go.transform.eulerAngles.y / totalRotationTime;
 float x_degs = go.transform.x/ totalRotationTime;
 //etc...
 go.transform.Rotate(new Vector3(x_degs * Time.deltaTime, degreesPerSecond * Time.deltaTime, 0));
0 голосов
/ 28 апреля 2020

Всякий раз, когда вы хотите, чтобы что-то двигалось в течение указанного времени, я бы рекомендовал не делать это в Update, а вместо этого использовать Coroutine . Он работает как небольшой временный метод Update и выполняется каждый кадр до следующего yield. это лучше поддерживать и контролировать, чем метод Update.

Затем выполните вращение, используя Quaternion.Lerp или также Quaternion.Slerp, в зависимости от вашего бита. нужно

private IEnumerator RotateOverTime(Transform transformToRotate, Quaternion targetRotation, float duration)
{
    var startRotation = transformToRotate.rotation;

    var timePassed = 0f;
    while(timePassed < duration)
    {
        var factor = timePassed / duration;
        // optional add ease-in and -out
        //factor = Mathf.SmoothStep(0, 1, factor);

        transformToRotate.rotation = Quaternion.Lerp(startRotation, targetRotation, factor);
        // or
        //transformToRotate.rotation = Quaternion.Slerp(startRotation, targetRotation, factor);

        // increae by the time passed since last frame
        timePassed += time.deltaTime;

        // important! This tells Unity to interrupt here, render this frame
        // and continue from here in the next frame
        yield return null;
    }

    // to be sure to end with exact values set the target rotation fix when done
    transformToRotate.rotation = targetRotation;
}

Теперь, чтобы запустить эту процедуру, вы должны вызвать ее через StartCoroutine, например,

// simply stop any other running routine so you don't get concurrent ones
StopAllCoroutines();
StartCoroutine(transformToRotate, otherTransform.rotation, 3f);
...