Menu
CoddyTech

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.

challenge icon

Desafio

Médio

Faça a coruja girar suavemente na direção apontada por cada seta.

  1. Adicione Quaternion goal; e defina-o como transform.rotation em Start().
  2. Ao usar Input.GetKeyDown para cada seta, defina goal, por exemplo goal = Quaternion.LookRotation(Vector3.right);: cima +z, direita +x, baixo -z, esquerda -x.
  3. 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

Pratique por conta própria: Playground de Unity