Menu
CoddyTech

Quaternioni

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 41 di 63.

Un Quaternion è il tipo di Unity per una rotazione: transform.rotation è un esempio, così come il valore restituito da Quaternion.Euler. I suoi quattro numeri x, y, z e w non sono angoli e non devi mai impostarli manualmente. Quello che fai con le rotazioni è moltiplicarle. Una rotazione moltiplicata per un vettore ruota il vettore:

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);

La rotazione va a sinistra: Vector3.forward * transform.rotation non viene compilato. La terza riga ruota un offset in base alla rotazione dell'oggetto, quindi lamp è il punto situato 1 unità sopra e 2 davanti all'oggetto, secondo le direzioni proprie dell'oggetto, indipendentemente da quale direzione sia rivolto.

Una rotazione moltiplicata per un'altra rotazione combina le due rotazioni. transform.rotation * Quaternion.Euler(0, 90, 0) applica prima la rotazione dell'oggetto e poi un quarto di giro attorno al suo asse y proprio; invertendo l'ordine, il quarto di giro avviene attorno all'asse y del mondo. Per un oggetto verticale, entrambi danno lo stesso risultato. Per un aereo inclinato di 30 gradi, invece, no, perché il suo asse y proprio è inclinato insieme all'aereo:

Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0);    // muso (0.87, 0.5, 0): sale mentre vira
Quaternion world = Quaternion.Euler(0, 90, 0) * banked;  // muso (1, 0, 0): rimane orizzontale

Quaternion.identity è l'assenza totale di rotazione, quella che hai passato a Instantiate. Moltiplicare per essa non cambia nulla e transform.rotation = Quaternion.identity; riporta un oggetto alla sua posa senza rotazione.

challenge icon

Sfida

Medio

La pistola ruota con le frecce sinistra e destra, mentre la barra spaziatrice spara un proiettile dritto in avanti. Fai in modo che la barra spaziatrice spari una raffica di tre proiettili: uno dritto in avanti, uno ruotato di spread (20) gradi a destra rispetto alla direzione della pistola e uno di 20 gradi a sinistra. La raffica deve ruotare insieme alla pistola.

  • Ogni proiettile è rivolto nella propria direzione (lo script Bullet già pronto lo fa volare in avanti).
  • Ogni proiettile parte a 1 unità dal centro della pistola, lungo la propria direzione.

Premi Play, ruota e spara, poi premi Check.

Provalo tu

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))
        {
            // Un proiettile, dritto in avanti. Sparane tre: a -spread, 0 e spread gradi.
            Instantiate(bulletPrefab, transform.position, transform.rotation);
        }
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fisica e gameplay