Gira suavemente
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 43 de 63.
Asignar transform.rotation directamente a 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, sin sobrepasar nunca el objetivo. Si se usa turnSpeed * Time.deltaTime como paso, el objeto gira a una velocidad 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, girando 30 grados cada uno. Gira por el camino más corto y el objetivo se vuelve a calcular en cada fotograma, así que sigue a un sol en movimiento.
Quaternion.Slerp(a, b, t) es la rotación que está a una fracción t del recorrido de a a b, igual que Vector3.Lerp para los puntos. Escrito 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 nunca 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 en un cañón que gira 60 grados por segundo, usa RotateTowards.
Desafío
IntermedioEl búho gira para mirar hacia donde lo apuntes. Cada flecha le da una nueva dirección hacia la que mirar: arriba +z, derecha +x, abajo -z, izquierda -x. Al pulsarla, empieza a girar hacia esa dirección a turnSpeed (180) grados por segundo, a un ritmo constante, y termina el giro incluso después de soltar la tecla, deteniéndose exactamente en la nueva dirección.
Pulsa Play, pulsa las flechas y, después, Check.
Pruébalo tú mismo
using UnityEngine;
public class Owl : MonoBehaviour
{
public float turnSpeed = 180f;
void Update()
{
// Arriba, derecha, abajo, izquierda: gira para orientarte hacia +z, +x, -z, -x a turnSpeed grados por segundo.
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
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 lanzamiento2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de monedas
La bola rodanteMonedas para recoger