Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Wyś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, oraz onRaceOver, które niczego nie przekazuje.
  • Za każdym razem, gdy samochód (oznaczony tagiem Player) przekracza linię, zaliczane jest okrążenie: wywołaj onLap z 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łaj onRaceOver. 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
    }
}
quiz iconSprawdź się

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