Menu
CoddyTech

Update i LateUpdate

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

W każdej klatce Unity wywołuje Update() dla każdego skryptu, a dopiero gdy wszystkie zakończą działanie, wywołuje LateUpdate() dla każdego skryptu. Kolejność wywoływania Update() poszczególnych obiektów nie zależy od ciebie.

Ma to znaczenie w przypadku wszystkiego, co podąża za czymś innym. Kamera kopiująca pozycję gracza w Update() może uruchomić się, zanim własne Update() gracza zdąży go przesunąć, a wtedy skopiuje pozycję gracza sprzed klatki: kamera będzie pozostawać krok z tyłu, a to, czy tak się stanie, może się zmienić po dodaniu obiektów lub ponownym wczytaniu sceny. W LateUpdate() kopiowanie zawsze następuje po przesunięciu gracza:

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

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

Zasada jest taka: przesuwaj obiekty w Update(), a kod reagujący na ich końcowe położenie, na przykład kamery, etykiety i celowanie, umieszczaj w LateUpdate(). Obie metody uruchamiają się raz na klatkę, a Time.deltaTime oznacza to samo w obu.

challenge icon

Wyzwanie

Średni

Zarówno gracz, jak i jego etykieta z nazwą uruchamiają skrypt Mover. Na obiekcie Player zmienna target jest pusta, więc strzałki nim poruszają. Na obiekcie NameTag zmienna target wskazuje gracza, więc etykieta znajduje się nad nim w odległości offset.

Naciśnij Play i przytrzymaj strzałkę: etykieta pozostaje w tyle za graczem. Tutaj Update() etykiety uruchamia się jako pierwsze i kopiuje położenie gracza sprzed jednej klatki. Napraw to tak, aby etykieta znajdowała się dokładnie nad graczem w każdej klatce, a ruch strzałkami pozostaw w Update(). Następnie naciśnij Check.

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);
            }
        }
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy skryptów w Unity