Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Der 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);
            }
        }
    }
}
quiz iconTeste dich selbst

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