Gire suavemente
Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 45 de 71.
Definir transform.rotation diretamente como uma nova rotação gira um objeto em um único quadro. Quaternion.RotateTowards(current, goal, maxDegrees) retorna current girado em direção a goal em, no máximo, maxDegrees, sem nunca ultrapassar o objetivo. Usando turnSpeed * Time.deltaTime como incremento, o objeto gira a uma velocidade constante e para exatamente no objetivo, assim como MoveTowards faz com as posições. Este girassol acompanha o sol a 30 graus 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);
}Se o sol estiver a 90 graus de distância, o girassol leva 3 segundos para alcançá-lo, girando 30 graus de cada vez. Ele gira pelo caminho mais curto, e o objetivo é calculado novamente a cada quadro, então acompanha um sol em movimento.
Quaternion.Slerp(a, b, t) é a rotação que percorre uma fração t do caminho de a até b, assim como Vector3.Lerp faz com pontos. Escrito como Slerp(transform.rotation, goal, 5f * Time.deltaTime) em Update(), ele percorre uma parte do ângulo restante em cada quadro: rápido no início, cada vez mais devagar perto do objetivo, nunca em uma velocidade fixa e sem nunca chegar exatamente lá. Essa suavidade é adequada para uma câmera ou para uma cabeça girando. Quando a velocidade de giro é uma regra do jogo, como no caso de um canhão que gira 60 graus por segundo, use RotateTowards.
Desafio
MédioFaça a coruja girar suavemente na direção apontada por cada seta.
- Adicione
Quaternion goal;e defina-o comotransform.rotationemStart(). - Ao usar
Input.GetKeyDownpara cada seta, definagoal, por exemplogoal = Quaternion.LookRotation(Vector3.right);: cima +z, direita +x, baixo -z, esquerda -x. - A cada quadro, defina
transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);.
Pressione “Jogar” e toque nas setas. Depois, pressione “Verificar”.
Experimente você mesmo
using UnityEngine;
public class Owl : MonoBehaviour
{
public float turnSpeed = 180f;
void Update()
{
// Cima, direita, baixo, esquerda: gire para ficar voltado para +z, +x, -z, -x à velocidade de turnSpeed graus por segundo.
}
}
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