Event-Bus anlegen

Um Objekt lose zu koppeln und dadurch Abhängigkeiten und aufwändige Suchläufe zu beseitigen, führen wir einen zentralen Event-Bus ein, der von Ereignisgebern und Ereignis-Reaktoren unabhängig angebunden wird.

Gewünschte Fähigkeiten des Event-Bus

  • Anmeldung von Zuhörern: EigenschaftenZeichner soll sich hier eintragen können und benachrichtigt werden, wenn ein Mausereignis statt findet.

  • Benachrichtigung von Zuhörern: ObjektMitTitel soll hier eine Benachrichtung über ein eingetroffenes Ereignis absetzen können, die dann an den Eigenschaftenzeichner weitergeleitet wird.

Script um Ereignisse zu koordinieren

  • Klicke im Unity Editor mit in Project und wähle CreateC#-Script, um ein neues Script zu erzeugen.

  • Nenne das Script EventBus.

  • Doppelklicke auf dieses neue Script, um es in Visual Studio zu öffnen.

  • Lösche Start und Update.

Anmeldung von Zuhörern ermöglichen

  • Füge in EventBus.cs folgenden Code ein, um die Form von Funktionen als Delegat festzulegen und eine Ereignisliste anzulegen in die Funktionen der Delegaten-Form eingetragen werden können:
      public delegate void FunktionFuerObjektMitTitel(ObjektMitTitel omt);
      public event FunktionFuerObjektMitTitel beiObjektMitTitelAenderung;

Benachrichtigung von Zuhörern ermöglichen

  • Füge in EventBus.cs folgenden Code ein, um die Form von Funktionen als Delegat festzulegen und eine Ereignisliste anzulegen in die Funktionen der Delegaten-Form eingetragen werden können:
      public void beiObjektMitTitelAenderung_aufrufen(ObjektMitTitel dasObjekt)
      {
        beiObjektMitTitelAenderung(dasObjekt);
      }

EventBus an Scripte anbinden

  • Melde den EigenschaftenZeichner bei Entstehung am EventBus an:
      /// <summary>
      /// Wenn der Eigenschaftenzeichner erzeugt wurde und bereit ist...
      /// </summary>
      public void Awake()
      {
          EventBus.bus.beiObjektMitTitelAenderung += zeichneObjekt; // Im Eventbus registrieren, dass die oben definierte Funktion zeichneObjekt aufgerufen wird.
      }

      public void OnDestroy()
      {
          EventBus.bus.beiObjektMitTitelAenderung -= zeichneObjekt; // Wenn dieser EigenschaftenZeichner gelöscht wird, auch die Benachrichtung wieder auflösen. (Sonst NullPointerException, wenn versucht wird, die Nachricht an das nicht mehr vorhandene Objekt zu schicken.)
      }
  • Ändere ObjektMitTitel so, dass es das Ereignis auslöst, wenn die Mausereignisse eintreten:
      public void OnMouseEnter() // Unity-Nachricht: Unity weiß schon automatisch, wann es diese Funktion aufrufen muss
      {
          EventBus.bus.beiObjektMitTitelAenderung_aufrufen(this); // Zeigt die Maus auf mich, dann mich selbst an im Eventbus eingetragene Darstellungsfunktionen weiterleiten.
      }

      public void OnMouseExit()
      {
          EventBus.bus.beiObjektMitTitelAenderung_aufrufen(null); // Wird die Maus vom Objekt runter bewegt, dann Null (Leere) an im Eventbus eingetragene Darstellungsfunktionen weiterleiten.
      }

Testen

  • Starte das Spiel über den Play-Button oder Strg+P.

  • Fahre mit der Maus im Game über das Restaurant und beobachte, wie sich der Text ändert.

Das Verhalten sollte sich nicht vom vorherigen Verhalten unterscheiden, doch ist der Code nun sehr viel flexibler und eleganter.

Anhänge

Die hier gezeigten Lektionen sind eine Auswahl von Inhalten aus mehreren verschiedenen kostenpflichtigen Kursen. Um alle Inhalte zu sehen, müssen mehrere Kurse gekauft werden. Änderungen und Aktualisierungen der Kursinhalte werden auf dieser Seite möglicherweise nicht oder nicht sofort dargestellt. Die kostenpflichtigen Udemy-Kurse enthalten neben den Videos auch Übungen, Textartikel, weitere Materialien, sowie ein Support-Forum für Fragen. Vereinzelt kann eine Lektion im mehreren Kursen gleichzeitig enthalten sein. Wenn etwas unklar ist, stelle Deine Frage per E-Mail an rene@gamedev-profi.de .