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.
Défi
MoyenLe 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);
}
}
}
}
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
1Votre premier script
Bonjour, UnityPlacez le cubeBouger à chaque imageTourner chaque secondeDirigez avec les touchesRécapitulatif : conduisez le cube4Vecteurs
Addition de vecteursDirectionsEspaces local et mondeVitesse diagonaleDistance entre les objetsVector3 est une structRécapitulatif : pilote de drone7Projet : Attrape l’étoile
L’attrapeurUne étoile qui tombe10Le cycle de vie d’un script
Awake et StartUpdate et LateUpdateOnEnable et OnDisableL’ordre du cycle de vieRécapitulatif : journaliseur du cycle de vie2L’inspecteur
Champs de l’inspecteurSerializeFieldNombres flottants et MathfAttributs de l’inspecteurRécapitulatif : ascenseur5Transformations et hiérarchie
Parents et enfantsÉchelleRegarder les objetsSe déplacer vers un pointRécapitulatif : Lune en orbite8Rechercher des objets
Rechercher par nomTagsRechercher par typeLes références plutôt que FindLe null de UnityRécapitulatif : la pièce la plus proche11Projet : Esquivez les blocs
Le coureurBlocs qui tombent6GameObjects et composants
Références dans l’InspectorObtenir un composantComposants manquantsAjouter un composantRequireComponentAfficher et masquerRécapitulatif : interrupteur