Menu
CoddyTech

UnityEvent-Felder

Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 14 von 64.

Das On Click () einer Schaltfläche ist ein UnityEvent-Feld, und auch deine eigenen Skripte können eines haben. Ein öffentliches UnityEvent-Feld wird im Inspector als dieselbe Art von Liste angezeigt, und das Skript löst es mit Invoke() aus, ohne zu wissen, womit es verknüpft ist. Dieser Countdown zählt einmal pro Sekunde herunter:

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();
        }
    }
}

Im Inspector enthält On Finished () Zeilen wie bei einer Schaltfläche: Eine Zeile startet die Rakete, eine andere öffnet das Tor. Eine andere Stufe verwendet denselben Countdown mit anderen Zeilen erneut, und niemand muss ein neues Skript schreiben. UnityEvent<int> übergibt einen Wert. In seinem Dropdown-Menü wird eine Methode, die einen int entgegennimmt, unter Dynamic int aufgeführt, und diese Zeile erhält den an Invoke übergebenen Wert, hier die verbleibenden Sekunden. Dieselbe Methode wird unter Static Parameters stattdessen mit einer Zahl verknüpft, die in die Zeile eingetragen wird. Auch Methoden ohne Parameter können verknüpft werden.

Unity erstellt ein UnityEvent-Feld, wenn es das Skript lädt. Daher ist onTick niemals null und benötigt kein ?., und der Code kann Listener mit onTick.AddListener(ShowSeconds) hinzufügen. Wähle ein UnityEvent, wenn die Reaktion je nach Objekt unterschiedlich ist und im Inspector eingerichtet wird – von dir oder von einem Designer, der das Skript nie öffnet. Wähle ein C#-Event, wenn Code darauf reagiert: Der Compiler überprüft die Methodennamen, sodass eine Umbenennung den Build fehlschlagen lässt, statt eine unauffällige Zeile <Missing> zu hinterlassen. Ein C#-Event wird außerdem nie im Inspector angezeigt.

challenge icon

Aufgabe

Einfach

Gib FinishLine die Events, mit denen die Zeilen der Szene verbunden sind.

  1. Füge using UnityEngine.Events;, public UnityEvent<int> onLap;, public UnityEvent onRaceOver; und ein privates int für die gefahrenen Runden hinzu.
  2. Zähle in OnTriggerEnter die Runde und rufe onLap.Invoke mit der Anzahl der gefahrenen Runden auf, wenn other mit Player gekennzeichnet ist.
  3. Rufe onRaceOver.Invoke() auf, wenn laps erreicht ist; danach hat das Überqueren keine Wirkung.

Drücke „Spielen“ und fahre drei Runden. Drücke dann „Prüfen“.

Probier es selbst

using UnityEngine;

public class FinishLine : MonoBehaviour
{
    public int laps = 3;

    void OnTriggerEnter(Collider other)
    {
        // Das Auto hat die Ziellinie überquert: eine weitere Runde geschafft
    }
}

Alle Lektionen in Spielarchitektur in Unity

Übe selbstständig: Unity-Playground