Mira hacia donde te mueves
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 44 de 71.
transform.LookAt necesita un punto hacia el que mirar. A menudo, lo que tienes es una dirección: una velocidad, el viento, la trayectoria de algo que se ha movido. Quaternion.LookRotation(direction) devuelve la rotación cuyo eje hacia delante (la flecha azul del eje z) apunta en esa dirección, manteniendo la parte superior del objeto orientada hacia arriba en el mundo. Una flecha disparada al aire apunta hacia arriba al principio y se inclina al caer, porque su velocidad hace lo mismo:
Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (rb.linearVelocity != Vector3.zero)
{
transform.rotation = Quaternion.LookRotation(rb.linearVelocity);
}
}Solo importa la dirección, no la longitud: (1, 0, 2) y (3, 0, 6) producen la misma rotación. Un vector cero no tiene dirección, así que LookRotation(Vector3.zero) registra Look rotation viewing vector is zero y devuelve Quaternion.identity, que hace que el objeto mire hacia +z. Por eso la flecha lo comprueba primero: cuando se detiene, conserva la orientación que tenía. LookAt(target.position) produce la misma rotación que LookRotation(target.position - transform.position).
La componente vertical de la dirección inclina hacia arriba o hacia abajo el eje hacia delante. Para algo que debe mantenerse erguido, como un caminante que sube una pendiente, establece primero y de la dirección en 0, para que el objeto solo gire alrededor de y. Un segundo argumento, LookRotation(direction, Vector3.up), indica cuál es la dirección hacia arriba; eso es lo que obtienes con Vector3.up si no lo incluyes.
Desafío
IntermedioHaz que la abeja mire hacia donde vuela, manteniéndose erguida.
- En
LateUpdate(), estableceVector3 direction = transform.position - lastPosition;ydirection.y = 0;. - Solo cuando
direction != Vector3.zero, establecetransform.rotation = Quaternion.LookRotation(direction);, para que la abeja mantenga la orientación cuando esté quieta. - Por último, guarda
transform.positionenlastPosition.
Pulsa «Jugar»: la abeja gira para mirar hacia cada flor a la que vuela. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
public class FaceMotion : MonoBehaviour
{
Vector3 lastPosition;
void Start()
{
lastPosition = transform.position;
}
void LateUpdate()
{
// Orienta la abeja en la dirección en la que se movió desde el último fotograma.
}
}
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