Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Haz que la abeja mire hacia donde vuela, manteniéndose erguida.

  1. En LateUpdate(), establece Vector3 direction = transform.position - lastPosition; y direction.y = 0;.
  2. Solo cuando direction != Vector3.zero, establece transform.rotation = Quaternion.LookRotation(direction);, para que la abeja mantenga la orientación cuando esté quieta.
  3. Por último, guarda transform.position en lastPosition.

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

Practica por tu cuenta: Playground de Unity