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.
Aufgabe
EinfachGib FinishLine die Events, mit denen die Zeilen der Szene verbunden sind.
- Füge
using UnityEngine.Events;,public UnityEvent<int> onLap;,public UnityEvent onRaceOver;und ein privates int für die gefahrenen Runden hinzu. - Zähle in
OnTriggerEnterdie Runde und rufeonLap.Invokemit der Anzahl der gefahrenen Runden auf, wennothermitPlayergekennzeichnet ist. - Rufe
onRaceOver.Invoke()auf, wennlapserreicht 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
1Komponenten statt Hierarchien
Kleine KomponentenEin Basis-GegnerskriptAbstrakte KomponentenZusammenwirkende KomponentenRückblick: Modulares GeschützRückblick: Zwillingskanone4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-TabelleRückblick: Beute auswürfeln2Schnittstellen in Unity
IDamageableSchnittstellen und TryGetComponentGetComponentsZusammenfassung: InteraktionstasteZusammenfassung: Nächstes in Reichweite5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenDen Wind speichernWellen als DatenRückblick: Item-DatenbankRückblick: Im Shop einkaufen8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearestÜbe selbstständig: Unity-Playground