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.
3 respuestas
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);
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);
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));
Nuevas preguntas
unity3d
Unity es un motor de juego multiplataforma de Unity Technologies.