Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

El 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);
            }
        }
    }
}
quiz iconPonte a prueba

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