Gira suavemente
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 45 de 71.
Establecer transform.rotation directamente en una nueva rotación hace que un objeto gire en un solo fotograma. Quaternion.RotateTowards(current, goal, maxDegrees) devuelve current girado hacia goal como máximo maxDegrees, y nunca más allá del objetivo. Si se usa turnSpeed * Time.deltaTime como paso, el objeto gira a un ritmo constante y se detiene exactamente en su objetivo, igual que hace MoveTowards con las posiciones. Este girasol sigue al sol a 30 grados por segundo:
public Transform sun;
public float turnSpeed = 30f;
void Update()
{
Quaternion goal = Quaternion.LookRotation(sun.position - transform.position);
transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);
}Si el sol está a 90 grados, el girasol tarda 3 segundos en alcanzarlo, girando 30 grados cada segundo. Gira por el camino más corto y el objetivo se calcula de nuevo en cada fotograma, así que sigue al sol cuando se mueve.
Quaternion.Slerp(a, b, t) es la rotación que está a una fracción t del recorrido entre a y b, igual que Vector3.Lerp para los puntos. Si se escribe como Slerp(transform.rotation, goal, 5f * Time.deltaTime) en Update(), gira una parte del ángulo restante en cada fotograma: rápido al principio, cada vez más despacio cerca del objetivo, nunca a una velocidad fija y sin llegar a alcanzarlo del todo. Esa suavidad es adecuada para una cámara o para girar la cabeza. Cuando la velocidad de giro sea una regla del juego, como la de un cañón que gira 60 grados por segundo, usa RotateTowards.
Desafío
IntermedioHaz que el búho gire suavemente hacia donde apunta cada flecha.
- Añade
Quaternion goal;y asígnaletransform.rotationenStart(). - Cuando
Input.GetKeyDowndetecte cada flecha, asígnale un valor agoal, por ejemplogoal = Quaternion.LookRotation(Vector3.right);: arriba +z, derecha +x, abajo -z, izquierda -x. - En cada fotograma, asigna
transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);.
Pulsa «Jugar» y toca las flechas. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
public class Owl : MonoBehaviour
{
public float turnSpeed = 180f;
void Update()
{
// Arriba, derecha, abajo, izquierda: gira para mirar hacia +z, +x, -z, -x a turnSpeed grados por segundo.
}
}
Todas las lecciones de Física y jugabilidad
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento4Corrutinas
InvocarInvokeRepeating y CancelInvokeTu primera corrutinaBucles en corrutinasDetener corrutinasRepaso: cuenta regresiva10Proyecto: Escape de la arena
La arenaCazadores2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de Monedas
La pelota rodanteMonedas para recoger3Disparadores
Colisionadores de tipo triggerOnTriggerEnterObjetos coleccionablesLas cajas guardan el restoZonas letalesEntrada y salidaRepaso: llave y puertaPractica por tu cuenta: Playground de Unity