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.
Wyzwanie
ŚredniZaró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);
}
}
}
}
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
1Twój pierwszy skrypt
Witaj, UnityUmieść sześcianPoruszaj się w każdej klatceObracaj się co sekundęSteruj za pomocą klawiszyPodsumowanie: Prowadź sześcian4Wektory
Dodawanie wektorówKierunkiPrzestrzeń lokalna i globalnaPrędkość po przekątnejOdległość między obiektamiVector3 jest strukturąPodsumowanie: pilot drona10Cykl życia skryptu
Awake i StartUpdate i LateUpdateOnEnable i OnDisableKolejność cyklu życiaPodsumowanie: rejestrator cyklu życia2Inspektor
Pola inspektoraSerializeFieldLiczby zmiennoprzecinkowe i MathfAtrybuty inspektoraPodsumowanie: Winda5Transformacje i hierarchia
Rodzice i dzieciSkalaPatrz na obiektyPoruszanie się w kierunku punktuPodsumowanie: Księżyc krążący po orbicie3Wejście
Naciśnięty, przytrzymany, zwolnionyOsiePrzyciski o nazwachPrzyciski myszyPowtórka: naładowany skok6Obiekty gry i komponenty
Referencje w InspectorzePobieranie komponentuBrakujące komponentyDodawanie komponentuRequireComponentPokazywanie i ukrywaniePodsumowanie: włącznik światła