Как использовать RotateAround со временем? - PullRequest
0 голосов
/ 24 сентября 2019
private float degrees = 90f;

&

transform.RotateAround(new Vector3(0f, 0f, 0f), new Vector3(0f, 0f, 1f), degrees)

Итак, я хочу повернуть gameObject в течение 2 секунд с 0 градусов до 90 градусов.Что я должен делать?Спасибо:)

1 Ответ

1 голос
/ 24 сентября 2019

Всякий раз, когда вы хотите, чтобы с течением времени в Unity что-то происходило плавно, вы обычно используете Time.deltaTime

Время завершения в секундах с момента последнего кадра.

Таким образом, вы преобразуете любой параметр «speed» из «amount / frame» в независимую от частоты кадров «количество / секунд».

Затем, если вы хотите, чтобы вращение заняло 2 секунды, или в этомЕсли у вас есть скорость 45° / s, вы просто умножаете / делите на соответствующий коэффициент

transform.RotateAround(Vector3.zero, Vector3.up, degrees / durationInSeconds * Time.deltaTime);

Если вы хотите сделать поворот на 90 ° в течение 2 секунд, но вместо остановки вам следует использовать сопрограмм

StartCoroutine(Rotate(90, 2));

// flag to avoid concurrnt routines
private bool isRotating;

private IEnumerator Rotate(float degrees, float duration)
{
    if(isRotating) yield break;
    isRotating = true;

    var passedTime = 0f;
    var startRotation = transform.rotation;
    var targetRotation = transform.rotation * Quaternion.Euler(0, 0, degrees);

    while(passedTime < duration)
    {
        // this will always be a linear value between 0 and 1
        var lerpFactor = passedTime / duration;
        //optionally you can add ease-in and ease-out
        //lerpFactor = Mathf.SmoothStep(0, 1, lerFactor);

        // This rotates linear 
        transform.rotation = Quaternion.Lerp(startRotation, targetRotation, lerpFactor);
        // OR This already rotates smoothed using a spherical interpolation
        transform.rotation = Quaternion.Slerp(startRotation, targetRotation, lerpFactor);

        // Here you see it is again - Time.deltaTime
        // increase the passedTime by the time passed since last frame
        // to avoid overshooting we clamp it
        timePassed += Mathf.Min(duration - passedTime, Time.deltaTime);

        // yield in a Coroutine reads like
        // pause here, render this frame and continue from here in the next frame
        yield return null;
    }

    // just to be sure
    transform.rotation = targetRotation;

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