Menu
CoddyTech

Update e LateUpdate

Fa parte della sezione Fondamenti di scripting in Unity del percorso Unity di Coddy. Lezione 56 di 67.

A ogni frame Unity chiama Update() su ogni script e, solo quando hanno terminato tutti, chiama LateUpdate() su ogni script. Non sei tu a decidere quale Update() di un oggetto viene eseguito per primo.

Questo è importante per tutto ciò che segue qualcos'altro. Una telecamera che copia la posizione del giocatore in Update() potrebbe essere eseguita prima che l'Update() del giocatore lo abbia spostato; in tal caso, copia la posizione che il giocatore aveva un frame prima: la telecamera rimane indietro di un passo e questo comportamento può cambiare quando si aggiungono oggetti o si ricarica la scena. In LateUpdate() la copia avviene sempre dopo che il giocatore si è spostato:

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);

void LateUpdate()
{
    transform.position = player.position + offset;
}

La regola: sposta gli oggetti in Update() e inserisci in LateUpdate() il codice che reagisce alla posizione finale degli oggetti, come quello per telecamere, etichette e puntamento. Entrambi vengono eseguiti una volta per frame e Time.deltaTime ha lo stesso significato in entrambi.

challenge icon

Sfida

Medio

Sia il giocatore sia la sua etichetta con il nome eseguono lo script Mover. Sul Player, target è vuoto, quindi le frecce lo spostano. Su NameTag, target è il giocatore, quindi l’etichetta rimane offset sopra di lui.

Premi Play e tieni premuta una freccia: l’etichetta rimane indietro rispetto al giocatore. In questo caso, Update() dell’etichetta viene eseguito per primo e copia la posizione del giocatore di un fotogramma prima. Correggi il codice in modo che l’etichetta sia esattamente sopra il giocatore a ogni fotogramma e mantieni il movimento con le frecce in Update(). Poi premi Check.

Provalo tu

using UnityEngine;

public class Mover : MonoBehaviour
{
    public Transform target;
    public Vector3 offset;
    public float speed = 4f;

    void Update()
    {
        if (target != null)
        {
            transform.position = target.position + offset;
        }
        else
        {
            if (Input.GetKey(KeyCode.RightArrow))
            {
                transform.position += new Vector3(speed * Time.deltaTime, 0, 0);
            }
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                transform.position -= new Vector3(speed * Time.deltaTime, 0, 0);
            }
        }
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti di scripting in Unity