Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach

Ein 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, und onRaceOver, das nichts übergibt.
  • Jedes Mal, wenn das Auto (mit dem Tag Player) die Ziellinie überquert, ist eine Runde geschafft: Rufe onLap mit 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, rufe onRaceOver auf. 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
    }
}
quiz iconTeste dich selbst

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