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.
Sfida
MedioSia 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);
}
}
}
}
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
1Il tuo primo script
Ciao, UnityPosiziona il cuboMuovi a ogni frameRuota ogni secondoGuida con i tastiRiepilogo: guida il cubo4Vettori
Sommare vettoriDirezioniSpazio locale e spazio globaleVelocità diagonaleDistanza tra gli oggettiVector3 è una structRiepilogo: pilota di droni7Progetto: Acchiappa la stella
L'acchiappatoreUna stella cadente10Il ciclo di vita degli script
Awake e StartUpdate e LateUpdateOnEnable e OnDisableL’ordine del ciclo di vitaRipasso: logger del ciclo di vita2L'Inspector
Campi dell'InspectorSerializeFieldNumeri decimali e MathfAttributi dell'InspectorRiepilogo: Ascensore5Trasformazioni e gerarchia
Genitori e figliScalaGuarda gli oggettiMuoversi verso un puntoRiepilogo: Luna in orbita6Oggetti di gioco e componenti
Riferimenti nell’InspectorOttenere un componenteComponenti mancantiAggiungere un componenteRequireComponentMostrare e nascondereRipasso: interruttore della luce