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 niveladaQuaternion.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.
Desafio
MédioA 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);
}
}
}
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
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento2Colisõ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 Coletar