Update y LateUpdate
Parte de la sección Fundamentos de scripting en Unity del Journey de Unity de Coddy. Lección 56 de 67.
En cada fotograma, Unity llama a Update() en cada script, y solo cuando todos han terminado llama a LateUpdate() en cada script. El orden en que se ejecuta Update() de cada objeto no depende de ti.
Eso importa para cualquier cosa que siga a otra. Una cámara que copia la posición del jugador en Update() puede ejecutarse antes de que el propio Update() del jugador lo haya movido, y entonces copia la posición que tenía el jugador hace un fotograma: la cámara se queda un paso atrás, y que eso ocurra puede cambiar cuando se añaden objetos o se vuelve a cargar la escena. En LateUpdate(), la copia siempre se realiza después de que el jugador se haya movido:
public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);
void LateUpdate()
{
transform.position = player.position + offset;
}La regla: mueve las cosas en Update() y coloca en LateUpdate() el código que reacciona a la posición final de las cosas, como las cámaras, las etiquetas y la orientación de la puntería. Ambos se ejecutan una vez por fotograma, y Time.deltaTime significa lo mismo en ambos.
Desafío
IntermedioEl jugador y su etiqueta de nombre ejecutan ambos el script Mover. En el Player, target está vacío, así que las flechas lo mueven. En el NameTag, target es el jugador, así que la etiqueta se sitúa offset por encima de él.
Pulsa Play y mantén pulsada una flecha: la etiqueta va detrás del jugador. Aquí, Update() de la etiqueta se ejecuta primero y copia la posición en la que estaba el jugador un fotograma antes. Corrígelo para que la etiqueta esté justo encima del jugador en cada fotograma y mantén el movimiento con las flechas en Update(). Después, pulsa Check.
Pruébalo tú mismo
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);
}
}
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos de scripting en Unity
1Tu primer script
Hola, UnityColoca el cuboMuévete en cada fotogramaGira cada segundoDirige con las teclasRepaso: conduce el cubo4Vectores
Sumar vectoresDireccionesEspacio local y globalVelocidad diagonalDistancia entre objetosVector3 es una estructuraRepaso: piloto de dron7Proyecto: Atrapa la estrella
El atrapadorUna estrella fugaz10El ciclo de vida de los scripts
Awake y StartUpdate y LateUpdateOnEnable y OnDisableEl orden del ciclo de vidaRepaso: registrador del ciclo de vida2El Inspector
Campos del InspectorSerializeFieldNúmeros decimales y MathfAtributos del InspectorRepaso: Ascensor5Transformaciones y jerarquía
Padres e hijosEscalaMirar objetosMoverse hacia un puntoRepaso: Luna en órbita8Encontrar cosas
Buscar por nombreEtiquetasBuscar por tipoLas referencias superan a FindEl valor nulo de UnityRepaso: la moneda más cercana11Proyecto: Esquiva los bloques
El corredorBloques que caen6GameObjects y componentes
Referencias en el InspectorObtener un componenteComponentes faltantesAñadir un componenteRequireComponentMostrar y ocultarRepaso: interruptor de luz