Menu
CoddyTech

Update e LateUpdate

Parte da seção Noções básicas de scripting no Unity do Journey de Unity da Coddy. Lição 56 de 67.

A cada quadro, o Unity chama Update() em cada script e, somente quando todos terminam, chama LateUpdate() em cada script. A ordem em que o Update() de cada objeto é executado não depende de você.

Isso importa para tudo que acompanha outra coisa. Uma câmera que copia a posição do jogador em Update() pode ser executada antes que o próprio Update() do jogador o mova, e então copia a posição em que o jogador estava um quadro antes: a câmera fica um passo atrás, e isso pode mudar quando objetos são adicionados ou a cena é recarregada. Em LateUpdate(), a cópia sempre acontece depois que o jogador se moveu:

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);

void LateUpdate()
{
    transform.position = player.position + offset;
}

A regra: mova as coisas em Update() e coloque o código que reage à posição final das coisas, como câmeras, rótulos e mira, em LateUpdate(). Ambos são executados uma vez por quadro, e Time.deltaTime significa a mesma coisa em ambos.

challenge icon

Desafio

Médio

O jogador e sua etiqueta de nome executam o script Mover. No Player, target está vazio, então as setas o movem. No NameTag, target é o jogador, então a etiqueta fica offset acima dele.

Pressione Play e mantenha uma seta pressionada: a etiqueta fica atrás do jogador. Aqui, o Update() da etiqueta é executado primeiro e copia a posição em que o jogador estava um quadro atrás. Corrija isso para que a etiqueta fique exatamente acima do jogador em cada quadro e mantenha o movimento pelas setas em Update(). Depois, Check.

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Noções básicas de scripting no Unity