Menu
CoddyTech

Update et LateUpdate

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

À chaque image, Unity appelle Update() sur chaque script, et ce n’est que lorsque tous ont terminé qu’il appelle LateUpdate() sur chaque script. L’ordre dans lequel la méthode Update() de chaque objet est appelée ne dépend pas de vous.

C’est important pour tout ce qui suit autre chose. Une caméra qui copie la position du joueur dans Update() peut s’exécuter avant que le propre Update() du joueur ne l’ait déplacé, et copier alors sa position d’une image précédente : 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éplacez les objets dans Update(), et placez dans LateUpdate() le code qui réagit à la position finale des objets, comme celui des caméras, des étiquettes et de la visée. Les deux sont exécutées une fois par image, et Time.deltaTime a la même signification dans les deux.

challenge icon

Défi

Moyen

Le joueur et son étiquette de nom exécutent tous deux le script Mover. Sur le Player, target est vide, donc les flèches le déplacent. Sur le NameTag, target correspond au joueur, donc l’étiquette se trouve à une distance offset au-dessus de lui.

Appuie sur Play et maintiens une flèche enfoncée : l’étiquette traîne derrière le joueur. Ici, Update() de l’étiquette s’exécute en premier et copie la position du joueur telle qu’elle était une image plus tôt. Corrige cela pour que l’étiquette soit exactement au-dessus du joueur à chaque image, et garde le déplacement avec les flèches dans Update(). Puis clique sur Check.

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);
            }
        }
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

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