Menu
CoddyTech

Update et LateUpdate

Fait partie de la section Les bases du scripting dans Unity du Journey Unity de Coddy. Leçon 71 sur 85.

À chaque image, Unity appelle Update() sur chaque script, et ce n’est qu’une fois qu’ils ont tous terminé qu’il appelle LateUpdate() sur chaque script. Tu ne peux pas choisir quel objet exécute son Update() en premier.

C’est important pour tout ce qui dépend d’autre chose. Une caméra qui copie la position du joueur dans Update() peut s’exécuter avant que le Update() du joueur ne l’ait déplacé. Elle copie alors la position qu’occupait le joueur une image plus tôt : la caméra a un temps de retard, et cela peut changer lorsque des objets sont ajoutés ou que la scène est rechargée. Dans LateUpdate(), la copie a toujours lieu après le déplacement du joueur :

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

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

La règle : déplace les objets dans Update(), et place dans LateUpdate() le code qui réagit à leur position finale, par exemple celui des caméras, des étiquettes et de la visée. Les deux s’exécutent une fois par image, et Time.deltaTime a la même signification dans les deux.

challenge icon

Défi

Moyen

Fais en sorte que l’étiquette reste exactement au-dessus du joueur à chaque image.

  1. Ajoute void LateUpdate(), qui s’exécute après le Update() de chaque script.
  2. Déplace la partie if (target != null) dedans, et garde uniquement le déplacement avec les flèches dans Update(), sous if (target == null).

Appuie sur « Jouer » et maintiens une flèche enfoncée : l’étiquette reste juste au-dessus du joueur. Puis, appuie sur « Vérifier ».

Essayez vous-même

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

Toutes les leçons de Les bases du scripting dans Unity

Entraînez-vous par vous-même : Playground Unity