Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Dodaj do FinishLine zdarzenia, do których podłączone są wiersze sceny.

  1. Dodaj using UnityEngine.Events;, public UnityEvent<int> onLap;, public UnityEvent onRaceOver; oraz prywatną zmienną typu int przechowującą liczbę ukończonych okrążeń.
  2. W metodzie OnTriggerEnter, gdy obiekt other ma tag Player, zalicz okrążenie i wywołaj onLap.Invoke, przekazując liczbę ukończonych okrążeń.
  3. Gdy liczba ukończonych okrążeń osiągnie wartość laps, wywołaj onRaceOver.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

Poćwicz samodzielnie: Edytor online Unity