Menu
CoddyTech

Update e LateUpdate

Parte da seção Fundamentos de Scripting no Unity do Journey de Unity da Coddy. Lição 71 de 85.

A cada quadro, o Unity chama Update() em cada script e, somente quando todos terminam, chama LateUpdate() em cada script. Você não decide qual objeto executa Update() primeiro.

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 atrás: a câmera fica um passo para trá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 em LateUpdate() o código que reage à posição final das coisas, como câmeras, rótulos e mira. Ambos são executados uma vez por quadro, e Time.deltaTime significa a mesma coisa em ambos.

challenge icon

Desafio

Médio

Faça a etiqueta com o nome ficar exatamente acima do jogador em cada quadro.

  1. Adicione void LateUpdate(), que é executado depois do Update() de cada script.
  2. Mova a parte if (target != null) para dentro dele e mantenha apenas o movimento pelas setas em Update(), dentro de if (target == null).

Pressione “Jogar” e mantenha uma seta pressionada: a etiqueta fica bem acima do jogador. Depois, “Verificar”.

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

Todas as lições de Fundamentos de Scripting no Unity

Pratique por conta própria: Playground de Unity