Menu
CoddyTech

Update i LateUpdate

Część sekcji Podstawy skryptów w Unity ścieżki Unity w Coddy. Lekcja 71 z 85.

W każdej klatce Unity wywołuje Update() w każdym skrypcie, a dopiero gdy wszystkie zakończą działanie, wywołuje LateUpdate() w każdym skrypcie. To, którego obiektu Update() zostanie wywołane jako pierwsze, nie zależy od ciebie.

Ma to znaczenie w przypadku wszystkiego, co podąża za czymś innym. Kamera, która kopiuje pozycję gracza w Update(), może wykonać się przed własnym Update() gracza, który przesuwa go na nowe miejsce, a wtedy kopiuje pozycję gracza sprzed jednej klatki: kamera pozostaje krok w tyle, a to, czy tak się dzieje, może się zmienić po dodaniu obiektów lub ponownym wczytaniu sceny. W LateUpdate() kopiowanie zawsze odbywa się po przesunięciu gracza:

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);

void LateUpdate()
{
    transform.position = player.position + offset;
}

Zasada: przesuwaj obiekty w Update(), a kod reagujący na położenie obiektów po ich przesunięciu, taki jak kod kamery, etykiet i celowania, umieszczaj w LateUpdate(). Obie metody wykonują się raz na klatkę, a Time.deltaTime oznacza to samo w obu.

challenge icon

Wyzwanie

Średni

Spraw, aby znacznik z nazwą znajdował się dokładnie nad graczem w każdej klatce.

  1. Dodaj void LateUpdate(), która uruchamia się po Update() każdego skryptu.
  2. Przenieś do niej część if (target != null), a w Update() pozostaw tylko ruch za pomocą strzałek, pod warunkiem if (target == null).

Naciśnij „Graj” i przytrzymaj strzałkę: znacznik pozostaje dokładnie nad graczem. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

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

Wszystkie lekcje w sekcji Podstawy skryptów w Unity

Poćwicz samodzielnie: Edytor online Unity