Update und LateUpdate
Teil des Abschnitts Grundlagen des Scripting in Unity der Unity-Journey von Coddy. Lektion 56 von 67.
In jedem Frame ruft Unity für jedes Skript Update() auf, und erst wenn alle damit fertig sind, ruft es für jedes Skript LateUpdate() auf. Welches Objekt zuerst Update() ausführt, kannst du nicht bestimmen.
Das ist für alles wichtig, was auf etwas anderem aufbaut. Eine Kamera, die die Position des Spielers in Update() übernimmt, wird möglicherweise ausgeführt, bevor das eigene Update() des Spielers ihn bewegt hat. Dann übernimmt sie die Position, die der Spieler einen Frame zuvor hatte: Die Kamera hängt einen Schritt hinterher, und ob das geschieht, kann sich ändern, wenn Objekte hinzugefügt oder die Szene neu geladen werden. In LateUpdate() erfolgt das Übernehmen immer, nachdem sich der Spieler bewegt hat:
public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);
void LateUpdate()
{
transform.position = player.position + offset;
}Die Regel: Bewege Dinge in Update() und platziere Code, der darauf reagiert, wo die Dinge gelandet sind, etwa für Kameras, Beschriftungen und das Zielen, in LateUpdate(). Beide werden einmal pro Frame ausgeführt, und Time.deltaTime bedeutet in beiden dasselbe.
Aufgabe
MittelDer Spieler und sein Namensschild führen beide das Skript Mover aus. Beim Player ist target leer, also bewegen die Pfeiltasten ihn. Beim NameTag ist target der Spieler, also befindet sich das Schild um offset versetzt über ihm.
Drücke Play und halte eine Pfeiltaste gedrückt: Das Schild bleibt hinter dem Spieler zurück. Hier wird Update() des Schilds zuerst ausgeführt und übernimmt die Position des Spielers von vor einem Frame. Ändere es so, dass das Schild in jedem Frame genau über dem Spieler ist, und lasse die Bewegung mit den Pfeiltasten in Update(). Klicke dann auf Check.
Probier es selbst
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);
}
}
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen des Scripting in Unity
1Dein erstes Skript
Hallo, UnityPlatziere den WürfelBewege dich in jedem FrameDrehe dich jede SekundeSteuere mit den TastenRückblick: Steuere den Würfel4Vektoren
Vektoren addierenRichtungenLokaler und globaler RaumDiagonale GeschwindigkeitAbstand zwischen ObjektenVector3 ist ein StructRückblick: Drohnenpilot7Projekt: Fang den Stern
Der FängerEin fallender Stern10Der Lebenszyklus eines Skripts
Awake und StartUpdate und LateUpdateOnEnable und OnDisableDie Reihenfolge im LebenszyklusRückblick: Lifecycle Logger5Transformationen und Hierarchie
Eltern und KinderSkalierungDinge ansehenAuf einen Punkt zubewegenRückblick: Umlaufender Mond8Dinge finden
Nach Namen findenTagsNach Typ findenReferenzen schlagen FindUnitys NullRückblick: Nächste Münze11Projekt: Weiche den Blöcken aus
Der LäuferFallende Blöcke6GameObjects und Komponenten
Referenzen im InspectorEine Komponente abrufenFehlende KomponentenEine Komponente hinzufügenRequireComponentEin- und AusblendenRückblick: Lichtschalter