Pola UnityEvent
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 14 z 64.
Pole Przycisk On Click () to pole typu UnityEvent, a własne skrypty też mogą mieć takie pole. Publiczne pole UnityEvent jest wyświetlane w Inspectorze jako lista tego samego rodzaju, a skrypt wywołuje je za pomocą Invoke(), nie wiedząc, co jest do niego podłączone. To odliczanie tyka raz na sekundę:
using UnityEngine;
using UnityEngine.Events;
public class Countdown : MonoBehaviour
{
public int seconds = 3;
public UnityEvent<int> onTick;
public UnityEvent onFinished;
void Start()
{
InvokeRepeating("Tick", 1f, 1f);
}
void Tick()
{
seconds--;
onTick.Invoke(seconds);
if (seconds == 0)
{
CancelInvoke("Tick");
onFinished.Invoke();
}
}
}W Inspectorze On Finished () ma wiersze, podobnie jak przycisk: jeden wiersz uruchamia rakietę, a drugi otwiera bramę. Inny poziom ponownie wykorzystuje ten sam Countdown z innymi wierszami, więc nikt nie pisze nowego skryptu. UnityEvent<int> przekazuje wartość. W jego menu rozwijanym metoda przyjmująca int jest wyświetlana w sekcji Dynamic int, a ten wiersz otrzymuje wartość przekazaną do Invoke — tutaj liczbę pozostałych sekund. Ta sama metoda w sekcji Static Parameters otrzymuje zamiast tego liczbę wpisaną w wierszu. Można też podłączyć metody bez parametrów.
Unity tworzy pole UnityEvent podczas wczytywania skryptu, więc onTick nigdy nie ma wartości null i nie wymaga ?., a kod może dodawać nasłuchiwacze za pomocą onTick.AddListener(ShowSeconds). Wybierz UnityEvent, gdy reakcja różni się w zależności od obiektu i jest konfigurowana w Inspectorze przez ciebie lub projektanta, który nigdy nie otwiera skryptu. Wybierz zdarzenie C#, gdy nasłuchuje go kod: kompilator sprawdza nazwy metod, więc zmiana nazwy powoduje błąd kompilacji zamiast pozostawienia nieaktywnego wiersza <Missing>, a zdarzenie C# nigdy nie jest wyświetlane w Inspectorze.
Wyzwanie
ŁatwyDodaj do FinishLine zdarzenia, do których podłączone są wiersze sceny.
- Dodaj
using UnityEngine.Events;,public UnityEvent<int> onLap;,public UnityEvent onRaceOver;oraz prywatną zmienną typu int przechowującą liczbę ukończonych okrążeń. - W metodzie
OnTriggerEnter, gdy obiektotherma tagPlayer, zalicz okrążenie i wywołajonLap.Invoke, przekazując liczbę ukończonych okrążeń. - Gdy liczba ukończonych okrążeń osiągnie wartość
laps, wywołajonRaceOver.Invoke(); potem przekraczanie linii mety nie będzie już nic robić.
Naciśnij „Graj” i przejedź trzy okrążenia. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
using UnityEngine;
public class FinishLine : MonoBehaviour
{
public int laps = 3;
void OnTriggerEnter(Collider other)
{
// samochód przekroczył linię: ukończono kolejne okrążenie
}
}
Wszystkie lekcje w sekcji Architektura gier w Unity
1Komponenty, nie hierarchie
Małe komponentyBazowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPowtórka: modułowa wieżyczkaPowtórka: podwójne działo4Dane serializowane
Klasy serializowalneListy w InspectorzeEnumy w InspectorzePodsumowanie: tabela łupówPodsumowanie: losowanie łupów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPowtórka: klawisz interakcjiPowtórka: najbliższy w zasięgu5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaOcal wiatrFale jako danePowtórka: Baza przedmiotówPowtórka: Kupowanie w sklepie8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearestPoćwicz samodzielnie: Edytor online Unity