In questo tutorial esamineremo cos'è Time.deltaTime in Unity e come usarlo.
Trascrizione del video
Salve a tutti! In questo tutorial esamineremo cos'è Time.deltaTime in Unity e come usarlo.
Questo tutorial di base è ideale per chi è alle prime armi nella programmazione di script C# in Unity, perché l'argomento è fondamentale e merita di essere ben compreso, poiché lo troverete in molti script e tutorial.
Il tutorial è stato creato utilizzando Unity 2022, ma Time.deltaTime è presente da diverse versioni del software e probabilmente lo sarà anche in futuro.
Time.deltaTime è una variabile che rappresenta il tempo trascorso, in secondi, tra l'ultimo frame e il frame corrente (o, se preferite, il tempo impiegato per completare il frame precedente).

Viene utilizzato per rendere i movimenti e le animazioni indipendenti dal frame rate, solitamente moltiplicando la velocità in unità al secondo di un oggetto per Time.deltaTime in ogni frame. In questo modo, la velocità per frame varierà in base al frame rate, garantendo la stessa velocità su dispositivi con prestazioni diverse.
Vediamo in pratica quanto appena descritto, con un semplicissimo esempio: il movimento di un oggetto lungo un asse a velocità costante.
Inseriamo un oggetto nella scena, inquadrando la scena dall'alto, con vista Isometrica.

Forniamo all'oggetto uno script C#, chiamandolo ad esempio movement, quindi creiamo un Vector3 per indicare uno spostamento di una unità (che noi vogliamo percorrere in un secondo):
private Vector3 obVelocity = new Vector3(0.0f, 0.0f, 1.0f);
Sappiamo che Update viene chiamata ad ogni fotogramma, tuttavia non sappiamo a quanti fotogrammi al secondo verrà eseguito il gioco, perché questo varia in base a diversi parametri.
Se il nostro frame rate fosse di 50 frame al secondo, sempre, potremmo modificare obVelocity in (0.0f, 0.0f, 0.02f), così da fare uno spostamento di 0.2 ad ogni chiamata di Update (e, quindi, ad ogni frame), arrivando ad uno spostamento di una unità al secondo, ma siccome non abbiamo questa possibilità, in Update scriveremo:
transform.position += (obVelocity * Time.deltaTime);

salviamo lo script, torniamo all'editor di Unity per osservare il risultato: l'oggetto si sposta linearmente, mantenendo la velocità di una unità della scena al secondo.
In definitiva: per far muovere un oggetto ad una determinata velocità (espressa come unità della scena al secondo), stabilite questa velocità in una variabile e, all'interno della funzione Update, moltiplicatela per Time.deltaTime, come vi ho mostrato poco fa.
Vediamo ora un altro esempio.
Nella scena che sto utilizzando adesso, alla Main Camera è stato fornito uno script di movimento che intercetta la pressione dei tasti freccia (tramite Input GetAxis per Horizontal e Vertical).
I valori di Horizontal e Vertical variano da -1 a 1, per entrambi, per cui se moltiplicassi direttamente questi valori per Time.deltaTime nella funzione Update dello script otterrei uno spostamento di una unità nella scena al secondo, ma questa soluzione non offre la possibilità di regolare la velocità.
Per risolvere questo problema, la cosa più semplice da fare è definire una variabile privata ma di tipo Serialized, da poter vedere e modificare nell'Inspector quando si prova il gioco nell'Editor.
Nell'esempio che vi sto mostrando a video questa variabile si chiama "speed" e inizialmente ha valore 12.

Nella funzione Update, il movimento è gestito tramite controller.Move, perché al personaggio è associato un componente di tipo Character Controller che viene spostato, appunto, tramite la funzione Move.
La funzione viene chiamata con un parametro piuttosto lungo, diviso in due parti: nella prima viene calcolato lo spostamento lungo gli assi X e Z in base all'input dell'utente, memorizzato nella variabile move (che è un Vector3), mentre nella seconda parte viene calcolata la forza di gravità se viene effettuato un salto.

Time.deltaTime viene utilizzato sia nel calcolo del movimento lungo gli assi che in quello verticale dovuto alla gravità, ma ignoriamo la seconda parte (che richiederebbe un discorso più lungo) e concentriamoci sulla prima.
Il vettore di movimento move viene moltiplicato per Time.deltaTime, come visto con il cubo nel primo esempio, ma viene moltiplicato anche per la variabile float speed.
Mi sposto quindi nell'editor di Unity e avvio il gioco per mostrarvi come sia possibile variare la velocità di spostamento del personaggio modificando, in tempo reale, il valore del parametro Speed, nella scheda dello script
In questo modo è possibile calibrare la velocità per l'avvio del gioco.
Dal momento che questa velocità viene moltiplicata per Time.deltaTime, sappiamo che sarà la stessa sui vari dispositivi, indipendentemente dal frame rate di esecuzione.
Essendo "speed" una variabile nel codice, sarà possibile modificarla anche durante l'esecuzione del gioco, in base ad alcuni eventi. Ad esempio, il giocatore potrebbe bere una pozione che gli permette di muoversi al doppio della velocità o, al contrario, di procedere più lentamente del normale. Il punto fondamentale è che questa velocità sarà coerente tra i vari dispositivi, poiché indipendente dal frame rate, grazie a Time.deltaTime.
In conclusione, in questo video abbiamo visto due esempi semplici di utilizzo di Time.deltaTime. Presto pubblicherò un video riguardante le rotazioni con Slerp, dove Time.deltaTime verrà utilizzato per realizzare rotazioni a velocità costante, indipendentemente dal frame rate.
Per questo tutorial, è tutto! A presto!