Update, FixedUpdate e LateUpdate in Unity: quando usare cosa

Se ti è mai capitato di perdere dell’input durante il debugging del tuo gioco sviluppato in Unity, oppure di avere una fisica instabile o effetti di jitter (ovvero quando la camera trema), allora sei nel posto giusto.
Un errore molto comune, soprattutto tra gli sviluppatori alle prime armi, è abusare del metodo Update(). Usarlo nel modo scorretto puo’ portare a bug difficili da tracciare e comportamenti inconsistenti. Per questo Unity mette a disposizione diversi metodi di aggiornamento e usarli nel modo corretto fa davvero la differenza.
Vediamo i tre principali: Update(), FixedUpdate() e LateUpdate().
Update()
Update() viene chiamato una volta per ogni frame, quindi la sua frequenza dipende dagli FPS del gioco.
Quando usarlo
- Input del giocatore (
Input.GetKey,Input.GetMouseButton, ecc.) - Logiche di gioco generiche
- Animazioni non legate alla fisica
Esempio
void Update()
{
float move = Input.GetAxis("Horizontal");
transform.Translate(Vector3.right * move * Time.deltaTime);
}
Dato che dipende dagli FPS, Update() non è costante nel tempo. Per questo motivo è fondamentale usare Time.deltaTime (rappresenta il tempo trascorso tra il frame corrente e quello precedente). Questo permette di rendere i movimenti indipendenti dal frame rate.
FixedUpdate()
FixedUpdate() è legato al sistema fisico di Unity. Viene chiamato a intervalli costanti (di default 0.02 secondi), indipendentemente dagli FPS.
Questo valore puo’ essere modificato in: Edit -> Project Settings -> Time
Quando usarlo
- Applicare forze (
Rigidbody.AddForce) - Movimento basato sulla fisica
- Tutto cio’ che interagisce con il motore fisico
Esempio
void FixedUpdate()
{
rb.AddForce(Vector3.forward * speed);
}
LateUpdate()
LateUpdate() viene chiamato dopo tutti gli Update(). è utile quando hai bisogno di lavorare con dati gia’ aggiornati.
Quando usarlo
- Camera che segue il player
- Allineamenti finali
- Correzioni di posizione
Esempio
void LateUpdate()
{
transform.position = player.position + offset;
}
Se muovi il player in Update() e la camera anche in Update(), potresti avere jitter. Con LateUpdate() sei sicuro che il player si è gia’ mosso.
Ordine di esecuzione
Unity segue questo ordine semplificato:
FixedUpdate()Update()LateUpdate()
Caso reale: movimento e collisioni
Un errore comune è gestire il movimento in Update() anche quando sono coinvolte collisioni fisiche.
Esempio
void Move()
{
Vector2 dir = new Vector2(hAxis, vAxis);
transform.Translate(dir * Time.deltaTime * speed);
}
void Update()
{
Move();
}
Questo potrebbe causare collisioni non precise perché il movimento avviene nel ciclo frame-based (Update) e la fisica viene calcolata nel ciclo fixed (FixedUpdate).
Soluzione
void FixedUpdate()
{
Move();
}
In questo modo movimento e fisica sono sincronizzati e le collisioni risultano più stabili.
Se ti è mai capitato di avere una camera che trema o si comporta in modo strano, probabilmente stavi aggiornando la posizione della camera in Update() invece che in LateUpdate(). Spostare il codice della camera in LateUpdate() risolve questo problema perché garantisce che la camera si aggiorni dopo che tutti gli altri oggetti si sono mossi.
Per concludere, usare Update(), FixedUpdate() e LateUpdate() nel modo corretto è fondamentale per evitare bug difficili da tracciare e migliorare le prestazioni del tuo gioco. Se vuoi approfondire ulteriormente, dai un’occhiata alle risorse qui sotto!
Risorse utili
- https://docs.unity3d.com/6000.3/Documentation/Manual/execution-order.html
- https://docs.unity3d.com/6000.3/Documentation/Manual/fixed-updates.html
- https://docs.unity3d.com/6000.4/Documentation/ScriptReference/MonoBehaviour.Update.html
- https://docs.unity3d.com/6000.4/Documentation/ScriptReference/MonoBehaviour.LateUpdate.html












