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 orizzontaleQuaternion.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.
Sfida
MedioLa 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);
}
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fisica e gameplay
1Corpo rigido
Gravità e massaSpingi con AddForceSalta con un impulsoFixedUpdate per la fisicaVelocitàCorpi cinematiciRiepilogo: piattaforma di lancio4Coroutine
InvokeInvokeRepeating, CancelInvokeLa tua prima coroutineCicli nelle coroutineInterrompere le coroutineRiepilogo: conto alla rovescia2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliere