Menu
CoddyTech

Update und LateUpdate

Teil des Abschnitts Unity-Scripting: Grundlagen der Unity-Journey von Coddy. Lektion 71 von 85.

In jedem Frame ruft Unity für jedes Skript Update() auf. Erst wenn alle damit fertig sind, ruft Unity für jedes Skript LateUpdate() auf. Du kannst nicht festlegen, welches Objekt zuerst sein Update() ausführt.

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 des Spielers von vor einem Frame: Die Kamera hinkt einen Schritt hinterher, und ob das passiert, kann sich ändern, wenn Objekte hinzugefügt oder die Szene neu geladen wird. 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 Dinge gelandet sind, etwa 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

Lass das Namensschild in jedem Frame genau über dem Spieler sitzen.

  1. Füge void LateUpdate() hinzu, das nach dem Update() jedes Skripts ausgeführt wird.
  2. Verschiebe den Teil if (target != null) dorthin und lass in Update() nur die Pfeilbewegung unter if (target == null).

Drücke „Spielen“ und halte eine Pfeiltaste gedrückt: Das Schild bleibt direkt über dem Spieler. Drücke dann „Prüfen“.

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

Alle Lektionen in Unity-Scripting: Grundlagen

Übe selbstständig: Unity-Playground