In questa lezione esaminimo i componenti relativi alla fisica 2D che Unity mette a disposizione per gli Sprite, di fatto molto simili a quelli visti per gli elementi 3D nella guida Unity di base.
Rigidbody 2D
Così come il suo ‘cugino' 3D, il Rigidbody2D è il componente che si occupa di dare ai GameObject un comportamento fisico da corpo rigido, ovvero un corpo che viene influenzato dalla gravità, che può urtare con altri oggetti, che può subire accelerazione e coppia (quello che in inglese si chiama ‘torque', ovvero un movimento rotatorio) e che non si deforma (altrimenti sarebbe un ‘soft body'... cosa non supportata in Unity, né in molti altri motori fisici).
Assegniamo i due componenti a due oggetti diversi (non possono coesistere sullo stesso GameObject!) per vederne le differenze. Il Rigidbody classico (3D):
E quello 2D:
Come si può vedere, i due componenti condividono in pieno le opzioni Mass, (Linear) Drag, Angular Drag, isKinematic, Interpolate e Collision Detection, di cui abbiamo parlato già nella lezione apposita nell'altra guida su Unity.
Il parametro Use Gravity diventa Gravity Scale nel Rigidbody2D, permettendoci non solo di annullare la gravità per questo corpo (impostandola a 0), ma anche di limitarla (impostandola su valori che vanno da 0 a 1) o di esagerarla (impostando più di 1). In questo modo si può anche rimediare alla gravità spesso un po' fluttuante di Unity, o dare ad alcuni oggetti un peso maggiore… ma non esagerate!
L'intera sezione Constraints viene eliminata in favore di un'unica opzione booleana chiamata FixedAngle: abilitandola, l'oggetto non ruoterà sull'unico asse sui potrebbe ruotare, ovvero l'asse Z.
I Collider 2D
Componente fondamentale per la fisica soprattutto in congiunzione con i Rigidbody2D, i Collider2D permettono agli oggetti di collidere fra loro, evitando che si sovrappongano. Inoltre così come per le controparti 3D, in programmazione è possibile ottenere tutte le caratteristiche degli urti che si producono fra i collider: la forza dell'urto, la direzione, i punti di contatto, eccetera.
I collider bidimensionali sono quattro. Mentre il Circle Collider 2D ed il Box Collider 2D non hanno bisogno di presentazioni perché sono essenzialmente la controparte 2D di Sphere Collider e Box Collider, gli Edge e Polygon Collider sono nuovi (introdotti in Unity dalla 4.3 in poi).
Unica novità presente in tutti i Collider 2D è la proprietà Used by Effector: una spunta che, se abilitata, dice a Unity di usare questo collider per calcolare gli effetti prodotti da un Effector (una novità di Unity 5 di cui parleremo in una delle prossime lezioni).
Polygon Collider 2D e Edge Collider 2D
Il Polygon Collider 2D assomiglia molto al Mesh Collider. Con esso si possono creare collider di forma arbitraria, lasciando che Unity analizzi la forma e ne posizioni i vertici, oppure piazzandoli noi a mano.
Sono permesse anche forme concave, perché Unity effettua la triangolarizzazione del collider: ogni volta che piazzate un punto, Unity ricalcola la traingolarizzazione scomponendo il collider in tanti piccoli triangoli (quindi convessi) per permettere prestazioni decenti.
Ad esempio, per uno Sprite molto piccolo, ecco il collider che Unity calcola di base:
Come si può vedere, è un collider da 5 punti che assomiglia a poco più che un rettangolo un po' storto. In questo caso sarebbe meglio usare un Box Collider 2D. In generale, per uno sprite così piccolo non servirebbero collisioni dettagliate (alla fine sarà un vermetto che striscia su una piattaforma, no?), ma se proprio vogliamo avere un collider preciso possiamo premere sul tasto Edit Collider nel componente.
Il collider diventa editabile, e possiamo aggiungere vertici cliccando su un qualunque punto del perimetro e trascinando, mentre possiamo rimuoverli tenendo premuto Ctrl (o Cmd su Mac) prima di cliccare su un vertice (il vertice diventa rosso). I triangoli che compongono il collider vengono aggiornati in tempo reale.
Con questo metodo, possiamo creare collider raffinati come questo:
Come sempre, se vi è possibile, è preferibile usare i due collider di base (Circle e Box2D, anche in combinazione fra loro) perché sono molto più leggeri in termini computazionali. Se avete un oggetto di forma allungata (come un rettangolo) è meglio ricavare il collider usando due Box Collider 2D piuttosto che un Polygon Collider.
In maniera simile, l'Edge Collider è un collider custom di cui si possono editare i vertici. L'Edge rappresenta un collider lineare, e diversamente dal Polygon Collider (ed in effetti anche da tutti gli altri!) non deve identificare una forma chiusa, e può essere una semplice linea retta (2 vertici) o una forma ad L (3 vertici), anche concava.
Per entrambi questi collider custom, in basso nell'Inspector è presente un sottopannello Points non editabile, che se aperto mostra le coordinate (locali) dei vertici contenuti nei collider. Ad esempio, per un semplice Edge Collider (non chiuso) da 4 vertici:
Physics Material 2D
Anche qui torna il paragone con il 3D: così come nelle tre dimensioni, i collider bidimensionali possono avere un materiale fisico 2D che ne definisce le caratteristiche in fase di collisione.
I Physics Material 2D contengono solo due proprietà: Bounciness (quanto l'oggetto rimbalza, ovvero quanta energia conserva dopo un urto) e Friction (l'attrito).
Per crearli basta andare sotto Assets > Create > Physics2D Material, e per utilizzarli si possono scegliere mediante browser impostando la proprietà di qualunque Collider 2D, oppure trascinare direttamente sugli oggetti Sprite nella Hierarchy: Unity li assegnerà direttamente al collider presente sull'oggetto.