Una delle cose più importanti nella realizzazione di un videogioco è la concretizzazione del sistema fisico, ovvero la realizzazione di corpi che, in primissima istanza, si comportano come se fossero soggetti a forza di gravità. Avrete notato che se ponete in una scena un piano ed un cubo, ad esempio, e premete Play dopo aver posizionato opportunamente una camera, il cubo rimarra sospeso nel vuoto.
Devo necessariamente premettere un paio di cose prima di andare avanti: anzitutto la differenza tra vista Globale e Locale. La prima, in effetti, fa riferimento ad una "visione" degli assi direzionali x,y,z in modo assoluto, quindi indipendente dai vari oggetti sulla scena, mentre la seconda è relativa a dove "sta guardando" un determinato GameObject. La distinzione viene fatta perchè, nel caso in cui ruotiate un certo personaggio, per esempio, il suo sistema di assi puo' non coincidere con quello globale, e puo' essere utile in alcuni casi passare dall'una all'altra.
Come forse saprete Unity3D permette di applicare la fisica ad un qualsiasi GameObject, ed il modo più semplice per farlo è quello di selezionare l'oggetto e dal menu Components selezionare Phisics-> RigidBody. Questo vi metterà a disposizione una nuova componente nella quale potrete decidere le caratteristiche fisiche dell'oggetto, tra cui:
- mass: la massa o "peso" dell'oggetto
- drag: il "rallentamento" che subisce l'oggetto durante il moto, ad esempio "effetto paracadute" che potete settare a 20, per esempio;
- angular drag: il "rallentamento" che subisce l'oggetto durante la rotazione, che potete settare a 5, per esempio;
- collision detect: discreta, continua, o continua e dinamica;
- use gravity: oggetto sottoposto alla forza di gravità lungo l'asse globale y, in direzione -1.
A questo punto proveremo ad applicare una forza ad esempio ad una sfera sulla quale avrete applicato la componente fisica, allo scopo di emulare il classico "moto di un proiettile" (il cannone che spara un colpo, per intenderci). Per farlo ricorreremo alla pratica funzione addForce, applicata ovviamente una sola volta quando l'oggetto è stato creato (ovvero dentro Awake(): vedi anche ciclo di vita di un GameObject):
var force = 20.0;
var direzione = Vector3 (0,1,1);
function Awake(){
rigidbody.AddForce(direzione * force);
}
var direzione = Vector3 (0,1,1);
function Awake(){
rigidbody.AddForce(direzione * force);
}
Il valore 20 rende il moto del proiettile visibile rispetto ad una massa fissata ad 1, se inserite altri valori dovrete calibrare per tentativi il resto di conseguenza. Inoltre ho introdotto un vettore direzione che spara, quindi, lungo (0,1,1) come è possibile vedere anche nel video:
Se poi ad esempio decidiamo di vincolare la direzione del movimento senza scomodare complesse formule matematiche, potrei congelare uno o più assi (freeze) e fare in modo che il movimento sia diretto verso l'alto (lungo l'asse y, tipo lancio di un missile).





