Menu
CoddyTech

Vire-se na direção do movimento

Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 42 de 63.

transform.LookAt precisa de um ponto para olhar. Muitas vezes, o que você tem é uma direção: uma velocidade, o vento, o sentido em que algo se moveu. Quaternion.LookRotation(direction) retorna a rotação cujo eixo para a frente (a seta azul do eixo z) aponta nessa direção, mantendo o eixo para cima do objeto voltado para o eixo para cima do mundo. Uma flecha disparada para o ar aponta para cima no início e inclina-se enquanto cai, porque sua velocidade faz o mesmo:

Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (rb.linearVelocity != Vector3.zero)
    {
        transform.rotation = Quaternion.LookRotation(rb.linearVelocity);
    }
}

Só a direção importa, não o comprimento: (1, 0, 2) e (3, 0, 6) dão a mesma rotação. Um vetor nulo não tem direção, então LookRotation(Vector3.zero) registra Look rotation viewing vector is zero e retorna Quaternion.identity, que faz o objeto apontar para +z. Por isso a flecha verifica primeiro: quando ela para, mantém a orientação que tinha. LookAt(target.position) dá a mesma rotação que LookRotation(target.position - transform.position).

A componente para cima ou para baixo da direção inclina o eixo para a frente para cima ou para baixo junto com ela. Para algo que precisa permanecer na vertical, como um personagem caminhando por uma ladeira, defina primeiro o y da direção como 0, para que o objeto gire apenas em torno de y. Um segundo argumento, LookRotation(direction, Vector3.up), indica qual direção é para cima; Vector3.up é o valor usado quando ele não é informado.

challenge icon

Desafio

Médio

A abelha voa de flor em flor. O script pronto Mover faz com que ela voe em linhas retas, subindo ou mergulhando pelo caminho, e a mantém parada por 1 segundo em cada flor; deixe Mover como está. Escreva FaceMotion para que a abelha fique voltada para a direção em que voa:

  • Ela fica voltada para a direção em que se moveu desde o último quadro, vista de cima.
  • Ela permanece na posição vertical: sem apontar o nariz para cima ou para baixo enquanto sobe ou mergulha.
  • Enquanto está parada, ela mantém a orientação que tinha, e nada é registrado.

O código vai em LateUpdate(), então Mover já moveu a abelha neste quadro. Pressione Jogar e, em seguida, Verificar.

Experimente você mesmo

using UnityEngine;

public class FaceMotion : MonoBehaviour
{
    Vector3 lastPosition;

    void Start()
    {
        lastPosition = transform.position;
    }

    void LateUpdate()
    {
        // Vire para a direção em que a abelha se moveu desde o último quadro.
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Física e jogabilidade