Update, FixedUpdate e LateUpdate in Unity: quando usare cosa

banner

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:

  1. FixedUpdate()
  2. Update()
  3. 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

Bio autore

Giuliana Muto - Sono Videogame Producer e Project Manager, appassionata di videogiochi. Ho capito di amarli dopo aver giocato a Super Mario Galaxy.

TheRedCode.it - Il mondo #tech a piccoli #bit

Partners

Community, aziende e persone che supportano attivamente il blog

Logo di Welyk
Logo di GrUSP
Logo di Python Milano
Logo di Schrodinger Hat
Logo di Python Biella Group
Logo di Fuzzy Brains
Logo di Django Girls Italy
Logo di Improove
Logo de Il Libro Open Source
Logo di NgRome
Logo de La Locanda del Tech
Logo di Tomorrow Devs
Logo di DevDojo

Vuoi diventare tech content creator? 🖊️

Se ti va di raccontare la tua esperienza nel mondo tech, questo è il posto giusto.

Cerchiamo voci autentiche, esempi pratici e punti di vista utili per chi legge.

Scrivici a collaborazioni[at]theredcode.it con una proposta: idea, taglio del contenuto e una breve presentazione. Non vediamo l'ora di leggere la tua esperienza!

Invia la tua idea