Entonces, en mi escena tengo mi objeto principal del juego, y un segundo objeto del juego que sirve como referencia. Quiero que el objeto principal del juego gire para que se vea de la misma manera que el segundo objeto del juego. Y esta rotación debe ocurrir en un tiempo establecido. Supongamos que la duración es de 3 segundos. Si el segundo objeto del juego tiene una rotación mundial de 0, 90, 0, el objeto principal del juego comienza a rotar de modo que después de tres segundos su rotación sea 0, 90, 0.

Entonces, tengo las transformaciones del objeto principal del juego y el segundo objeto del juego, ahora necesito calcular la cantidad a rotar por cuadro, para que la rotación ocurra en la duración correcta.

¡Apreciaría mucho que alguien pudiera ayudarme! Gracias de antemano.

0
TomatoBird 28 abr. 2020 a las 14:54

3 respuestas

La mejor respuesta

Siempre que desee que algo se mueva dentro de un tiempo específico, le recomendaría que no lo haga en Update, sino que use un Coroutine. Funciona como un pequeño método temporal Update y se ejecuta cada cuadro hasta el siguiente yield. es mejor mantener y controlar que el método Update.

Luego haga su rotación usando Quaternion.Lerp o también Quaternion.Slerp dependiendo un poco de sus necesidades

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;
}

Ahora, para comenzar esta rutina, debe llamarla a través de StartCoroutine como, p.

// simply stop any other running routine so you don't get concurrent ones
StopAllCoroutines();
StartCoroutine(transformToRotate, otherTransform.rotation, 3f);
0
derHugo 28 abr. 2020 a las 12:11

Puede utilizar el método Slerp para esto. Entonces, debería ser algo como esto en Actualización:

transform.rotation = Quaternion.Slerp(transform.rotation, secondTransform.rotation, rotationSpeed * Time.deltaTime);
0
Onurcan Onder 28 abr. 2020 a las 12:17

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

La respuesta para abreviar:

 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
barbecu 28 abr. 2020 a las 12:22