UnityEvent-Felder
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 12 von 50.
Das On Click () eines Buttons ist ein UnityEvent-Feld, und auch deine eigenen Skripte können eines haben. Ein öffentliches UnityEvent-Feld wird im Inspector als dieselbe Art 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 nimmt On Finished () Zeilen wie bei einem Button auf: Eine Zeile startet die Rakete, eine andere öffnet das Tor. In einem anderen Level wird derselbe Countdown mit anderen Zeilen wiederverwendet, und niemand schreibt ein neues Skript. UnityEvent<int> übergibt einen Wert. In seinem Dropdown 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 eingegeben 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 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#-Ereignis, wenn Code darauf reagiert: Der Compiler überprüft die Methodennamen, sodass eine Umbenennung den Build fehlschlagen lässt, statt eine unauffällige Zeile mit <Missing> zu hinterlassen. Ein C#-Ereignis wird nie im Inspector angezeigt.
Aufgabe
EinfachEin Rennen über drei Runden rund um die Insel. Die Pfeile steuern das Auto (Car.cs), und die Szene ist so eingerichtet, wie ein Designer sie im Inspector einrichten würde: Die Liste On Lap (Int32) von FinishLine ruft LapBoard.ShowLaps (Dynamic int) auf dem LapText und Crowd.Cheer auf der Crowd auf, und die Liste On Race Over () ruft LapBoard.ShowFinished und Car.Stop auf. Diese Skripte sind bereit, aber den Zeilen kann nichts zugewiesen werden, bis FinishLine die Events hat.
Schreibe FinishLine.cs:
- Zwei UnityEvent-Felder:
onLap, das eine int übergibt, undonRaceOver, das nichts übergibt. - Jedes Mal, wenn das Auto (mit dem Tag
Player) die Ziellinie überquert, ist eine Runde geschafft: RufeonLapmit der Anzahl der absolvierten Runden auf (1, dann 2, dann 3). Alles andere, was die Linie überquert, zählt nicht. - Wenn die Anzahl der absolvierten Runden
laps(3) erreicht, rufeonRaceOverauf. Danach hat das Überqueren der Linie keine Wirkung.
Drücke Play, fahre drei Runden um die Insel und drücke dann Check.
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
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Spielarchitektur in Unity
1Komponenten statt Hierarchien
Kleine KomponentenEin Basisskript für GegnerAbstrakte KomponentenKomponenten im ZusammenspielRückblick: Modularer Geschützturm4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-Tabelle7Zustandsautomaten
Zustände als KlassenEin ZustandsautomatÜbergängeGegner-KIWiederholung: Türzustände10Projekt: Arena-Überlebenskampf
Der HeldGegnertypen2Interfaces in Unity
IDamageableInterfaces und TryGetComponentGetComponentsRückblick: Interaktionstaste5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenWellen als DatenRückblick: Item-Datenbank8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearest3Ereignisse
C#-Events in UnityIn OnEnable abonnierenUnityEvent-FelderEvents steuern die UIRückblick: Achievement-Popup