Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Le Joint

Le giunture 2D, per legare insieme due oggetti modificandone il comportamento. Dal semplice collegamento (Distance), all'oscillazione elastica (Spring).
Le giunture 2D, per legare insieme due oggetti modificandone il comportamento. Dal semplice collegamento (Distance), all'oscillazione elastica (Spring).
Link copiato negli appunti

In questa lezione esaminiamo le giunture 2D (joints), ovvero quei componenti fisici che permettono di legare insieme due oggetti con diversi effetti interessanti. Possiamo fare riferimento alla guida Unity3D per le giunture in 3D

Distance Joint 2D

Come dice il nome, il Distance Joint è un semplice collegamento fra due oggetti che permette di mantenere una certa distanza fra di essi. Ci si potrebbe chiedere: perché non imparentare semplicemente gli oggetti fra loro? Il Distance Joint offre qualche opzione in più.

Vediamo i parametri:

  • Interessante notare come, mettendo il Connected Rigid Body su null si può agganciare la giuntura “al mondo” e selezionare il punto di aggancio con il parametro Anchor. In questo modo viene stabilita una connessione con un punto fisso nello spazio, un po' come se l'oggetto fosse inchiodato ad un muro.
  • Connected Anchor permette di modificare il punto del corpo da cui parte la giuntura in coordinate relative. Se viene impostato su un valore diverso da 0,0 (che corrisponde al centro) il corpo tenderà a ruotare quando la giuntura applica il suo effetto.
  • Distance permette di selezionare la distanza da mantenere, mentre Enable Collision fa sì che l'oggetto collida o no con quello a cui è connesso. Nel caso in cui Connected Rigid Body sia null, contrariamente a quanto si possa pensare l'opzione avrà comunque senso: se spuntata il corpo colliderà con qualunque oggetto (come farebbe senza Joint) mentre se disabilitata sarà praticamente intangibile.
  • Max Distance Only, se disattivo fa sì che il corpo cerchi di mantenere la distanza esatta (come se fosse legato ad un bastone), mentre se spuntato permette che il corpo possa muoversi finché si trova ad una distanza minore della massima (come se avesse un guinzaglio flessibile).

Ecco un esempio. La lumaca è legata all'ape (il suo Connected Rigid Body) ed ha una distanza fissa di 1.5:

Quando viene premuto Play la lumaca fa uno scatto per raggiungere la distanza richiesta (1.5), e poi per la gravità inizia ad oscillare mantenendo la distanza dall'ape.

Nota: Così come i Joint 3D, i Joint 2D si vedono in funzione solo quando la scena è in Play.

Spring Joint 2D

Lo Spring Joint 2D è una giuntura a molla che come la sua controparte 3D stabilisce un collegamento morbido fra due oggetti. I parametri sono molto simili a quelli di altri Joint, quindi ci limiteremo a commentare le differenze.

Il corpo a cui viene applicato il Joint cerca sempre di raggiungere la distanza impostata, ma diversamente dal Distance Joint 2D lo fa in maniera morbida e non con uno scatto al Play, quindi se esiste una forza che lo tiene lontano (come la forza di gravità) è possibile che il corpo non raggiunga mai la distanza desiderata.

Ad esempio:

In questo esempio, la lumaca è agganciata all'ape mediante uno Spring Joint 2D. La linea verde che li connette rappresenta la molla, ed il segmento orizzontale la distanza desiderata. Al Play, la lumaca inizia a salire per cercare di raggiungerla, ma la gravità fa sì che rimanga leggermente più in basso.

Cambiando i parametri Damping Ratio e Frequency si può controllare come agisce la molla. Damping Ratio rappresenta la durezza della molla: se è 0, la molla è molto morbida ed è possibile che al raggiungimento della posizione richiesta il corpo vada oltre (“overshoot”), come nell'animazione di cui sopra. Un valore alto farà si che la molla raggiunga rapidamente il valore richiesto e si fermi lì.

Con Frequency si possono invece controllare le oscillazioni che il corpo subisce nel raggiungere la posizione ricercata. Più è alto, più il corpo scatterà in posizione istantaneamente. Ad esempio, nella figura in alto è impostato ad 1. Se fosse stato 10, la lumaca sarebbe scattata quasi istantaneamente alla distanza 1.5 e si sarebbe fermata lì (rendendo il parametro Damping Ratio abbastanza inutile). Se fosse stato 0.1, le oscillazioni sarebbero state così lente che la lumaca avrebbe iniziato a cadere per colpa della gravità, non raggiungendo mai la posizione desiderata (anzi, probabilmente se ne allontanerebbe all'infinito).

Hinge Joint 2D

L'Hinge Joint 2D è essenzialmente una giuntura a cardine, come un cardine di una porta o (se visto di fronte) un foglio appeso al muro con una puntina da disegno. Tiene un corpo fermo in un punto, ma gli permette di ruotare sull'asse Z (ovvero il punto di vista), ed è possibile porre dei limiti all'angolo di questa rotazione. Ecco come si presenta nell'Inspector:

A parte il primo blocco che è uguale agli altri Joint 2D, le parti interessanti sono Use Motor e Use Limits.

Use Motor, se abilitato, crea una sorta di motore che fa ruotare il corpo sull'asse Z, con la velocità stabilità da Motor Speed. Il parametro Maximum Motor Force indica la forza che il motore applica, se il valore è troppo basso ed il corpo troppo grande/pesante il motore potrebbe non avere la forza necessaria a far girare il corpo (infatti di default è impostato su un valore alto, 10.000).

Se Use Motor non è spuntato, questi due parametri non hanno nessun effetto. Se invece è attivo, attenzione: il corpo si muoverà rigidamente secondo il motore e non verrà influenzato da eventuali urti con altri corpi. Se volete che reagisca in maniera realistica agli urti (come le pale di un mulino mosse dal vento), potete usare l'Hinge Joint 2D ma non Use Motor: sarà necessario ruotare il corpo applicando al Rigidbody2D una forza di torsione (torque) in programmazione (ovvero con Rigidbody2D.ApplyTorque()).

Use Limits invece stabilisce dei limiti alla rotazione, espressi in angoli (dove 0 è verso destra, 90 è verso l'alto, ecc.). Anche qui, assicuratevi che Use Limits sia attivo, altrimenti Lower Angle ed Upper Angle non avranno effetto. Se lo è, verrà visualizzato un gizmo (una mezzaluna verde) che indica visualmente gli angoli limite.

Ecco un esempio in movimento:

La lumaca ha un Hinge Joint 2D che non è legato a nessun oggetto (quindi ruota nel punto 0,0 dello spazio). Use Motor la fa ruotare di 30 gradi al secondo, mentre è stato impostato un limite di angoli da 0 a 90. Raggiunta la posizione finale (90), il motor si ferma e la lumaca smette di girare.

Slider Joint 2D

Lo Slider Joint 2D permette di creare una sorta di binario sul quale un corpo può scorrere.

Eccone i semplici parametri:

Come per l'Hinge Joint 2D, lo Slider Joint permette di stabilire un motore (Use Motor) che dà una spinta al corpo lungo l'asse del binario (asse che viene definito dal parametro Angle), e la possibilità di stabilire dei limiti (Use Limits), espressi in unità di Unity, a partire dalla posizione iniziale del corpo.

Ecco un esempio in movimento:

In questa animazione, la lumaca è legata ad un binario a -45°, ed ha i limiti impostati su -2, 2. Non avendo alcun motore attivo, la gravità la trascina verso il basso finché non incontra il limite del binario.

Wheel Joint 2D

In ultimo, il Wheel Joint 2D simula il comportamento di una ruota, per permettere la creazione di veicoli di vario genere. Ecco le sue proprietà:

Come si può vedere, molti parametri sono i soliti già visti per altri Joint 2D.

In generale, le ruote vanno agganciate (Connected Rigid Body) al corpo del veicolo che devono muovere, e possiamo usare Connected Anchor per regolare il punto di aggancio della sospensione.

Questa si può regolare con i parametri di Suspension, in modo simile a come abbiamo fatto per le molle (Spring Joint 2D), e dove l'angolo sarà per lo più 90° (verso l'alto) o poco meno, se vogliamo creare un veicolo più sportivo stile dune buggy.

Come per altri Joint 2D, il parametro Use Motor permette di definire un movimento automatico fisso nel tempo. In questo caso è attivo per facilitare l'esempio, ma in generale per simulare un vero veicolo probabilmente lo terremo disattivo, per poi applicare una velocità in programmazione (attraverso la proprietà WheelJoint2D.motorSpeed, eccola qui) a seconda dell'input del giocatore.

Ecco le ruote in azione. Parliamo qui di due Sprite rotondi, con un Circle Collider 2D, un Rigidbody 2D (richiesto dal Wheel) ed un Wheel Joint 2D con Use Motor attivo, e la Connected Anchor regolata appositamente per ognuna delle due ruote.

Nota: Da notare che le ruote non devono essere per forza imparentate al corpo del veicolo nella Hierarchy, è sufficiente che questo sia il loro Connected Rigid Body per far sì che lo seguano.

Se però preferite imparentarle nessun problema: invece di muoversi rigidamente insieme al veicolo, le ruote “onorano” la giuntura e si muovono in maniera morbida a seconda della sospensione, a prescindere da se siano child del veicolo o sulla root della scena.

Ti consigliamo anche