Menu
CoddyTech

Update y LateUpdate

Parte de la sección Fundamentos de scripting en Unity del Journey de Unity de Coddy. Lección 71 de 85.

En cada fotograma, Unity llama a Update() en cada script, y solo cuando todos han terminado llama a LateUpdate() en cada script. No depende de ti cuál objeto ejecuta primero Update().

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 un fotograma antes: la cámara se queda un paso atrás, y esto 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 pon el código que reacciona a la posición final de las cosas, como las cámaras, las etiquetas y la puntería, en LateUpdate(). Ambos se ejecutan una vez por fotograma, y Time.deltaTime significa lo mismo en ambos.

challenge icon

Desafío

Intermedio

Haz que la etiqueta con el nombre quede justo encima del jugador en cada fotograma.

  1. Añade void LateUpdate(), que se ejecuta después de Update() de cada script.
  2. Mueve la parte if (target != null) dentro de él y deja solo el movimiento con las flechas en Update(), bajo if (target == null).

Pulsa «Jugar» y mantén pulsada una flecha: la etiqueta permanece justo encima del jugador. Después, pulsa «Comprobar».

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

Todas las lecciones de Fundamentos de scripting en Unity

Practica por tu cuenta: Playground de Unity