Vire-se na direção do movimento
Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 44 de 71.
transform.LookAt precisa de um ponto para olhar. Muitas vezes, o que você tem é uma direção: uma velocidade, o vento, o caminho que algo percorreu. Quaternion.LookRotation(direction) retorna a rotação cujo eixo frontal (a seta azul do eixo z) aponta nessa direção, mantendo o eixo para cima do objeto orientado para cima no mundo. Uma flecha disparada para o ar aponta para cima no início e se inclina ao cair, 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) resultam na mesma rotação. Um vetor zero 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 virar de repente para +z. É por isso que a flecha verifica primeiro: quando para, ela mantém a orientação que tinha. LookAt(target.position) dá a mesma rotação que LookRotation(target.position - transform.position).
A parte da direção que aponta para cima ou para baixo inclina o eixo frontal para cima ou para baixo junto com ela. Para algo que precisa permanecer na vertical, como um caminhante subindo 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 é fornecido.
Desafio
MédioFaça a abelha ficar virada na direção em que voa, mantendo-se em pé.
- Em
LateUpdate(), definaVector3 direction = transform.position - lastPosition;edirection.y = 0;. - Somente quando
direction != Vector3.zero, definatransform.rotation = Quaternion.LookRotation(direction);, para que a abelha mantenha a direção para a qual está virada quando estiver parada. - Por último, armazene
transform.positionemlastPosition.
Pressione “Jogar”: a abelha se vira em direção a cada flor até a qual voa. Depois, pressione “Verificar”.
Experimente você mesmo
using UnityEngine;
public class FaceMotion : MonoBehaviour
{
Vector3 lastPosition;
void Start()
{
lastPosition = transform.position;
}
void LateUpdate()
{
// Vire-se para a direção em que a abelha se moveu desde o último quadro.
}
}
Todas as lições de Física e Jogabilidade
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento4Corrotinas
InvocarInvocar repetidamente, Cancelar invocaçãoSua primeira corrotinaLoops em corrotinasInterrompendo corrotinasRevisão: contagem regressiva10Projeto: Fuga da Arena
A ArenaCaçadores2Colisões
OnCollisionEnterO que eu acertei?Quebre no impactoNo chãoQuique e atritoFormas dos collidersRevisão: Parede destrutível5Projeto: Corrida das Moedas
A Bola RolanteMoedas para ColetarPratique por conta própria: Playground de Unity