Menu
CoddyTech

Quaternions

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

Um Quaternion é o tipo do Unity para uma rotação: transform.rotation é um, assim como o valor retornado por Quaternion.Euler. Seus quatro números x, y, z e w não são ângulos, e você nunca precisa defini-los por conta própria. O que você faz com rotações é multiplicá-las. Uma rotação vezes um vetor gira o vetor:

Vector3 a = Quaternion.Euler(0, 90, 0) * Vector3.forward;       // (1, 0, 0)
Vector3 b = Quaternion.Euler(0, 0, 45) * new Vector3(2, 0, 0);  // (1.41, 1.41, 0)
Vector3 lamp = transform.position + transform.rotation * new Vector3(0, 1, 2);

A rotação fica à esquerda: Vector3.forward * transform.rotation não compila. A terceira linha gira um deslocamento pela rotação do próprio objeto, então lamp é o ponto 1 unidade acima e 2 à frente do objeto, considerando as direções dele, para qualquer direção em que esteja voltado.

Uma rotação vezes outra rotação combina os dois giros. transform.rotation * Quaternion.Euler(0, 90, 0) corresponde à rotação do objeto seguida de um quarto de volta em torno do seu próprio eixo y; se você inverter a ordem, o quarto de volta será em torno do eixo y do mundo. Para um objeto na vertical, ambos produzem o mesmo resultado. Para um avião inclinado em 30 graus, não, porque o próprio eixo y dele fica inclinado junto com ele:

Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0);    // nariz (0.87, 0.5, 0): sobe enquanto vira
Quaternion world = Quaternion.Euler(0, 90, 0) * banked;  // nariz (1, 0, 0): permanece nivelada

Quaternion.identity não realiza giro algum; é aquele que você passou para Instantiate. Multiplicar por ele não altera nada, e transform.rotation = Quaternion.identity; retorna um objeto à sua pose sem rotação.

challenge icon

Desafio

Médio

A arma gira com as setas para a esquerda e para a direita, e a tecla Espaço dispara uma bala em linha reta. Faça com que a tecla Espaço dispare três balas em leque: uma em linha reta, uma girada spread (20) graus à direita da direção para a qual a arma está apontada e outra 20 graus à esquerda. O leque deve girar junto com a arma.

  • Cada bala aponta para sua própria direção (o script Bullet pronto faz com que ela voe para a frente).
  • Cada bala começa a 1 unidade do centro da arma, ao longo da sua própria direção.

Pressione Play, gire e dispare, depois pressione Check.

Experimente você mesmo

using UnityEngine;

public class Gun : MonoBehaviour
{
    public GameObject bulletPrefab;
    public float turnSpeed = 90f;
    public float spread = 20f;

    void Update()
    {
        if (Input.GetKey(KeyCode.RightArrow)) transform.Rotate(0, turnSpeed * Time.deltaTime, 0);
        if (Input.GetKey(KeyCode.LeftArrow)) transform.Rotate(0, -turnSpeed * Time.deltaTime, 0);

        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Uma bala, em linha reta. Dispare três: a -spread, 0 e spread graus.
            Instantiate(bulletPrefab, transform.position, transform.rotation);
        }
    }
}
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