Pola UnityEvent
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 12 z 50.
Przycisk On Click () to pole UnityEvent, a własne skrypty też mogą je mieć. Publiczne pole UnityEvent pojawia się w Inspectorze jako taka sama lista, a skrypt wywołuje je za pomocą Invoke(), nie wiedząc, co jest do niego podłączone. To odliczanie wykonuje tyknięcie 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 () zawiera wiersze takie jak w przypadku przycisku: jeden wiersz wystrzeliwuje rakietę, a drugi otwiera bramę. Inny poziom używa tego samego Countdown z innymi wierszami i nikt nie pisze nowego skryptu. UnityEvent<int> przekazuje wartość. Na liście rozwijanej metoda przyjmująca int jest wymieniona w sekcji Dynamic int, a ten wiersz otrzymuje wartość przekazaną do Invoke, czyli w tym przypadku 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ć odbiorców 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 na nie kod: kompilator sprawdza nazwy metod, więc zmiana nazwy powoduje błąd kompilacji, zamiast pozostawić pusty wiersz <Missing>, a zdarzenie C# nigdy nie pojawia się w Inspectorze.
Wyzwanie
ŁatwyWyścig na trzy okrążenia wokół wyspy. Strzałki sterują samochodem (Car.cs), a scenę skonfigurowano tak, jak zrobiłby to projektant w Inspectorze: lista On Lap (Int32) obiektu FinishLine wywołuje LapBoard.ShowLaps (Dynamic int) na obiekcie LapText oraz Crowd.Cheer na obiekcie Crowd, a lista On Race Over () wywołuje LapBoard.ShowFinished i Car.Stop. Te skrypty są gotowe, ale nie ma do czego podłączyć tych wierszy, dopóki FinishLine nie będzie mieć zdarzeń.
Napisz FinishLine.cs:
- Dwa pola UnityEvent:
onLap, które przekazuje int, orazonRaceOver, które niczego nie przekazuje. - Za każdym razem, gdy samochód (oznaczony tagiem
Player) przekracza linię, zaliczane jest okrążenie: wywołajonLapz liczbą zaliczonych okrążeń (1, potem 2, a następnie 3). Nic innego, co przekroczy linię, nie jest zaliczane. - Gdy liczba zaliczonych okrążeń osiągnie wartość
laps(3), wywołajonRaceOver. Po tym przekroczenie linii nic nie robi.
Naciśnij Play, przejedź trzy okrążenia wokół wyspy, a następnie naciśnij Check.
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
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Architektura gier w Unity
1Komponenty, nie hierarchie
Małe komponentyPodstawowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPodsumowanie: modułowa wieżyczka4Dane serializowane
Klasy serializowalneListy w InspectorzeWyliczenia w InspectorzePodsumowanie: tabela łupów10Projekt: Arena przetrwania
BohaterTypy wrogów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPodsumowanie: klawisz interakcji5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaFale jako danePowtórka: baza danych przedmiotów8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest3Zdarzenia
Zdarzenia C# w UnitySubskrypcja w OnEnablePola UnityEventZdarzenia sterują interfejsemPodsumowanie: wyskakujące okno osiągnięcia6Zapisywanie za pomocą JSON
JsonUtilityZapisz gręWczytywanie i wartości domyślnePowtórka: sloty zapisu