Menu
CoddyTech

Update e LateUpdate

Fa parte della sezione Fondamenti di scripting in Unity del percorso Unity di Coddy. Lezione 71 di 85.

A ogni fotogramma Unity chiama Update() su ogni script e chiama LateUpdate() su ogni script solo quando tutti hanno terminato. Non sta a te decidere quale oggetto esegue per primo Update().

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'aggiornamento del giocatore ne abbia modificato la posizione; quindi copia quella che il giocatore aveva un fotogramma prima: la telecamera rimane indietro di un passo, e ciò può cambiare quando vengono aggiunti oggetti o la scena viene ricaricata. 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 fotogramma e Time.deltaTime significa la stessa cosa in entrambi.

challenge icon

Sfida

Medio

Fai in modo che l’etichetta con il nome rimanga esattamente sopra il giocatore a ogni fotogramma.

  1. Aggiungi void LateUpdate(), che viene eseguito dopo l’Update() di ogni script.
  2. Sposta al suo interno la parte if (target != null) e lascia in Update() solo il movimento con le frecce, sotto if (target == null).

Premi «Gioca» e tieni premuta una freccia: l’etichetta rimane proprio sopra il giocatore. Poi premi «Verifica».

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);
            }
        }
    }
}

Tutte le lezioni di Fondamenti di scripting in Unity

Esercitati da solo: Playground Unity