Angoli di Eulero
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 40 di 63.
transform.eulerAngles è la rotazione di un oggetto espressa come tre angoli in gradi, attorno agli assi x, y e z. Unity memorizza la rotazione come un quaternione (nella lezione successiva) e ricalcola ogni volta i tre angoli quando li leggi, sempre come valori da 0 a 360. Inclina una tavola di -10 gradi attorno all'asse z e leggila di nuovo:
transform.rotation = Quaternion.Euler(0, 0, -10);
Debug.Log(transform.eulerAngles.z); // 350Imposti -10, ma il codice legge 350, quindi if (transform.eulerAngles.z < -5) non è mai vero. La lettura può modificare tutti e tre i numeri: imposta (100, 0, 0) e leggi (80, 180, 180), lo stesso orientamento espresso in un altro modo. Quaternion.Euler(x, y, z) funziona nella direzione opposta e accetta qualsiasi angolo: -10, 350 e 710 generano la stessa rotazione. Perciò conserva l'angolo in un tuo float, modificalo e applica i limiti lì, quindi imposta da esso l'intera rotazione. Questa altalena si inclina con le frecce e si ferma a 20 gradi in entrambe le direzioni:
public float speed = 40f;
float tilt;
void Update()
{
tilt += Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
tilt = Mathf.Clamp(tilt, -20f, 20f);
transform.rotation = Quaternion.Euler(0, 0, tilt);
}Non modificare una componente degli angoli che leggi. transform.eulerAngles.x = 110; non viene compilato (CS1612, come con position.x), e copiare eulerAngles, modificare x e riassegnare la copia parte dalla versione degli angoli di Unity. Dopo aver impostato (100, 0, 0), la copia è (80, 180, 180); aggiungi 10 a x e ottieni (90, 180, 180), che riporta l'oggetto a 90 invece di portarlo a 110.
Sfida
MedioLa telecamera di sicurezza sul palo dovrebbe oscillare da un lato all’altro senza interruzioni: partendo da davanti (0 gradi attorno a y), gira a destra, con y che aumenta, alla velocità di speed (30) gradi al secondo, inverte la direzione a limit (45), oscilla fino a -limit (-45), inverte di nuovo la direzione e così via. Per tutto il tempo mantiene l’inclinazione verso il basso di tilt (20) gradi attorno a x.
Premi Play: lo script iniziale inverte la direzione a 45, ma a -45 continua a girare. Scopri perché e correggi lo script, poi premi Check.
Provalo tu
using UnityEngine;
public class Sweep : MonoBehaviour
{
public float speed = 30f;
public float limit = 45f;
public float tilt = 20f; // gradi verso il basso, attorno a x
float direction = 1f;
void Update()
{
transform.Rotate(0, direction * speed * Time.deltaTime, 0, Space.World);
float angle = transform.eulerAngles.y;
if (angle > limit) direction = -1f;
if (angle < -limit) direction = 1f;
}
}
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 rovescia7Rotazione
Angoli di EuleroQuaternioniGuarda nella direzione in cui ti muoviRuota in modo fluidoRiepilogo: Torretta2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliere