E-Book-Update: Weitere Entwurfsmuster und SOLID-Prinzipien

Bereits im Herbst 2022 haben wir das E-Book Level up your code with game programming patternszusammen mit einem GitHub-Repository mit Beispielcode. Wir haben außerdem eine fünfteilige Video-Tutorial-Serie veröffentlicht, die das E-Book und das Beispielprojekt begleitet.
Wir haben von Ihnen ein großartiges Feedback zu diesen Ressourcen erhalten, und viele von Ihnen haben uns gebeten, weitere Designmuster zu behandeln. Vielen Dank für Ihr Feedback. Mein Team und ich verfolgen Ihre Kommentare aufmerksam und wissen sie sehr zu schätzen.
Heute freue ich mich, Ihnen mitteilen zu können, dass eine aktualisierte Ausgabe des E-Books " Level up your code with design patterns and SOLID" mit einer aktualisierten Version des Design Patterns-Beispielprojekts verfügbar ist, das Sie im Unity Asset Store herunterladen können.
Sowohl das E-Book als auch das Beispielprojekt basieren jetzt auf Unity 6 und enthalten mehr Beispiele und Muster. Das Beispielprojekt enthält auch weitere Funktionen von UI Toolkit, einschließlich eines Beispiels, das die Datenbindung demonstriert, ein beliebter Wunsch der Community.
Anmerkung: Unity 6 wird im Laufe dieses Jahres verfügbar sein. Wenn Sie den Beispielen in der Anleitung und dem dazugehörigen Demoprojekt folgen möchten, laden Sie sich Unity 6 Preview herunter.

Bevor Sie sich mit den neuen Inhalten des E-Books beschäftigen, werden sich einige von Ihnen, die mit den Konzepten weniger vertraut sind, vielleicht fragen: Warum sollte ich etwas über Design Patterns lernen und wie passen sie in die Unity Spieleentwicklung?
Um auf Ihr Feedback zurückzukommen: Obwohl die Grundlagen der objektorientierten Programmierung vielen vertraut sind, kann sich die Anwendung dieser Prinzipien in Ihrem eigenen Code manchmal abstrakt und allzu akademisch anfühlen.
Betrachten Sie es einmal so: Für jedes Problem beim Softwaredesign, mit dem Sie konfrontiert sind, haben unzählige Entwickler vor Ihnen ähnliche Herausforderungen bewältigt. Auch wenn man sie nicht immer direkt um Rat fragen kann, kann man von ihren Lösungen anhand von Entwurfsmustern lernen.
Entwurfsmuster bieten allgemeine Lösungen für häufige Probleme in der Softwareentwicklung. Es handelt sich dabei nicht um fertige Vorlagen, die Sie kopieren und in Ihren Code einfügen können, sondern um Werkzeuge, auf die Sie bei Bedarf zurückgreifen können. Einige Muster sind intuitiver als andere, aber jedes Muster kann in jedem Kontext nützlich sein.
Wir haben diesen Leitfaden für diejenigen erstellt, die neu im Bereich Design Patterns sind oder einfach nur eine Auffrischung benötigen. Er skizziert häufige Szenarien in der Spieleentwicklung, in denen diese Muster angewendet werden können. Wenn Sie von einer anderen objektorientierten Sprache wie Java oder C++ zu C# wechseln, finden Sie praktische Beispiele, wie Sie diese Muster speziell für Unity anpassen können.
In ihrem Kern sind Entwurfsmuster einfach nur Ideen. Sie sind nicht in jeder Situation anwendbar, aber wenn sie richtig eingesetzt werden, können sie Ihnen helfen, skalierbare Anwendungen zu erstellen. Ihre Integration in Ihre Projekte verbessert die Lesbarkeit und Wartbarkeit des Codes. Wenn Sie sich mit diesen Mustern vertraut machen, werden Sie Möglichkeiten zur Rationalisierung Ihres Entwicklungsprozesses erkennen.
Kurz gesagt, unser Leitfaden soll Ihre Programmierfähigkeiten verbessern, bessere Unity-Projekte erstellen und ein Verständnis für allgemeine Best Practices der Branche schaffen, die Sie während Ihrer gesamten Karriere mitnehmen können.

Werfen wir einen Blick auf die wichtigsten Neuerungen in den Ressourcen für Entwurfsmuster:
Ein erweiterter Abschnitt über die Umsetzung der SOLID-Grundsätze
Zu den fünf Kernprinzipien von SOLID gibt es jetzt jeweils umsetzbare Codebeispiele, die im Beispielprojekt implementiert und im E-Book erläutert werden. Zur Erinnerung: SOLID ist ein mnemonisches Akronym für fünf Grundprinzipien des Softwaredesigns. Betrachten Sie sie als fünf Grundregeln, die Sie im Hinterkopf behalten sollten und die Ihnen dabei helfen können, objektorientierte Designs verständlich, flexibel und wartbar zu halten.
Zur Erinnerung: SOLID steht für:
- Grundsatz der Alleinverantwortung: Eine Klasse sollte nur einen Grund haben, sich zu ändern, das heißt, sie sollte nur eine Aufgabe oder Verantwortung haben.
- Prinzip offen-geschlossen: Klassen sollten offen für Erweiterungen, aber geschlossen für Änderungen sein, so dass sie ohne Änderung des bestehenden Codes erweitert werden können.
- Liskov-Substitutionsprinzip: Objekte einer Oberklasse sollten durch Objekte ihrer Unterklassen ersetzt werden können, ohne dass die Korrektheit des Programms beeinträchtigt wird.
- Prinzip der Grenzflächentrennung: Die Kunden sollten nicht gezwungen werden, sich auf Schnittstellen zu verlassen, die sie nicht nutzen. Sie fördert die Schaffung spezifischer Schnittstellen anstelle einer einzigen, allgemein verwendbaren Schnittstelle.
- Prinzip der Abhängigkeitsinversion: High-Level-Module sollten nicht von Low-Level-Modulen abhängig sein, sondern beide sollten von Abstraktionen abhängen.

Das Wichtigste, was Sie aus den Beispielen mitnehmen können, ist, dass Sie durch die Befolgung der Prinzipien die folgenden Vorteile bei der Entwicklung Ihrer Spiele erreichen können:
- Lesbarkeit: Ein klarer und übersichtlicher Code erleichtert das Verständnis der Projektfunktionalität. Die Einhaltung der SOLID-Prinzipien kann die Lesbarkeit des Codes verbessern; wenn Ihre Codestandards konsistent sind, erhöhen Sie die Chance auf eine reibungslose Zusammenarbeit zwischen den Spieleprogrammierern in einem Team.
- Skalierbarkeit: Die Umsetzung von SOLID-Prinzipien fördert wartbaren Code, was für Projekte, die Sie skalieren wollen, entscheidend ist. Durch die Einhaltung dieser Grundsätze ist es weniger wahrscheinlich, dass Änderungen an einem Teil der Codebasis unerwartete Probleme an anderer Stelle verursachen. Dieser Ansatz stellt sicher, dass der Code flexibel bleibt und an sich ändernde Anforderungen angepasst werden kann.
- Geschwindigkeit: Letztendlich tragen die SOLID-Prinzipien zur Verbesserung der Arbeitsabläufe bei der Spieleentwicklung bei. Modularer Code, ein Schlüsselaspekt, der von SOLID hervorgehoben wird, beinhaltet die Zerlegung von Systemen in kleinere, überschaubare Komponenten. Dieser modulare Ansatz erleichtert das Testen, Debuggen und die projektübergreifende Wiederverwendung von Code, wodurch die Entwicklungszeit verkürzt und die Produktivität gesteigert wird.

Das aktualisierte E-Book und das Projekt enthalten vier neue Muster, womit sich die Gesamtzahl auf 11 erhöht. Hier ist eine kurze Übersicht über die einzelnen Angebote:
- Fabrikmuster: Ein klassischer Anwendungsfall ist das Vorhandensein von Powerups (z. B. Geschwindigkeitsschübe, Schilde oder Extraleben), die mehrere Attribute teilen, aber unterschiedliche Funktionen haben. Hier kann das Factory-Pattern verwendet werden, um Instanzen dieser verschiedenen Powerup-Klassen zu erstellen, die von einer gemeinsamen Schnittstelle oder Basisklasse abgeleitet sind, was ein flexibles Hinzufügen neuer Powerups ermöglicht, ohne den bestehenden Client-Code zu ändern.
- Objekt-Pooling: Manche würden dies eher als eine Technik zur Leistungsoptimierung als ein Entwurfsmuster bezeichnen. In jedem Fall ist es eine Möglichkeit, die Leistung zu verbessern, indem Objekte wiederverwendet werden, anstatt sie häufig zu erstellen und zu zerstören. In unserer Beispielszene finden Sie ein Beispiel für einen Geschützturm, der große Mengen an Geschossen mit hoher Geschwindigkeit abfeuert. Anstatt sie jedes Mal zu instanziieren (und aufzuräumen, sobald sie ihren Zweck erfüllt haben, was erhebliche Leistungskosten verursacht), verwenden wir das Muster, um sie immer wieder zu recyceln.
- Singleton: Das Singleton ist wahrscheinlich eines der häufigsten Muster in der Spieleentwicklung - wahrscheinlich verwenden Sie es bereits heute. Es ist nützlich, wenn Sie ein Objekt benötigen, das Aktionen in der gesamten Szene koordiniert. Sie könnten zum Beispiel einen Spielleiter in Ihrer Szene haben, der die Hauptspielschleife leitet. Bei der Verwendung des Singleton-Musters gibt es jedoch einige Fallstricke zu beachten, die wir in diesem Leitfaden erläutern.
- Befehlsmuster: Sie haben das Befehlsmuster wahrscheinlich schon bei der Arbeit gesehen, wenn Sie ein Spiel gespielt haben, das Rückgängig-/Wiederherstellungsfunktionen verwendet oder Ihren Eingabeverlauf in einer Liste speichert. Dieses Muster lässt sich zum Beispiel für ein Strategiespiel nutzen, bei dem der Benutzer mehrere Züge planen kann, bevor er sie in der Reihenfolge der Eingaben ausführt.
- Staatliches Muster: Dadurch kann ein Objekt sein Verhalten ändern, wenn sich sein interner Zustand ändert, was die Verwaltung des komplexen zustandsabhängigen Verhaltens von Spielfiguren oder UI-Elementen vereinfacht. Stellen Sie sich einen feindlichen NSC vor, der verschiedene Verhaltensweisen hat, z. B. "untätig", "patrouillieren" oder "angreifen", was von verschiedenen Spielszenarien abhängt, z. B. davon, wo sich der Spieler auf der Karte befindet.
- Beobachter-Muster: Dieses Muster hilft Ihnen, ein effizientes Ereignissystem zu implementieren, in dem Objekte dynamisch Ereignisse abonnieren und darauf reagieren können. Ein Anwendungsfall ist das Einsammeln von Munition durch einen Spieler in einem Actionspiel, das verschiedene Ereignisse auslöst, z. B. das Abspielen eines Tons, die Aktualisierung der Benutzeroberfläche und das Abspielen einer Animation.
- Model View Presenter (MVP): Im Kern geht es bei diesem Muster darum, die Anzeige des Zustands vom tatsächlichen Zustand zu entkoppeln und ein reaktives Design zu ermöglichen, bei dem die Ansichten automatisch als Reaktion auf Modelländerungen aktualisiert werden. Dies macht es zu einem weit verbreiteten Muster in der UI-Programmierung. Das Modellist die Daten, die Ansichtdie Benutzeroberfläche und der Präsentatorein Vermittler, der die Logik für die Ansicht handhabt und die Daten aus dem Modell synchronisiert.
- Model-View-ViewModel (neu): Wie der Name schon sagt, ist dieses Muster mit dem MVP-Muster verwandt, erweitert es aber um eine Laufzeitdatenbindung, die die Aktualisierung von UI-Elementen vereinfacht. In unserem Beispiel nutzen wir die neue Datenbindungsfunktion in UI Toolkit und Unity 6 Preview.
- Strategie-Muster (neu): Dieses Muster definiert eine Familie von Algorithmen, indem es jeden einzelnen kapselt, um sie austauschbar zu machen, so dass der Algorithmus unabhängig von den Clients, die ihn verwenden, variieren kann. Dies ist ein nützliches Muster, um z. B. verschiedene Bewegungsverhaltensweisen in der Spiel-KI zu implementieren.
- Fliegengewicht-Muster (neu): Verwenden Sie dieses Muster, um die Speichernutzung zu optimieren, indem Sie so viele Daten wie möglich mit ähnlichen Objekten teilen. Der Grundgedanke ist, dass Sie die gemeinsamen Daten von Objekten zentralisieren.
- Dirty Flag (Neu): Dieses Muster ist nützlich, um die Leistung zu optimieren, indem Objekte als "schmutzig" markiert werden, wenn sie sich ändern, so dass sie nur bei Bedarf neu berechnet oder aktualisiert werden. Dieses Muster kann Ihnen helfen, kostspielige Aktualisierungen in Spielschleifen oder in einigen Fällen des UI-Renderings zu verwalten.

Das Beispielprojekt spiegelt das E-Book wider, indem es jedes der 11 Muster in der Praxis demonstriert. Sie können das Projekt im Asset Store herunterladen und die entsprechenden Szenen verfolgen, um zu sehen, wie diese Muster in realen Szenarien angewendet werden. Beachten Sie, dass das Projekt Unity 6 Preview oder höher benötigt.
Bevor Sie sich in das Projekt stürzen, sollten Sie ein paar hilfreiche Tipps beachten.

Beginnen Sie mit der Bootstrap-Szene. Diese Szene konfiguriert die Demo und ermöglicht den Zugriff auf das Hauptmenü (mehr über das Konzept von SceneBootStrapper erfahren Sie im E-Book). Vom Hauptmenü aus können Sie zur entsprechenden Probe navigieren. Jede Szene demonstriert ein anderes SOLID-Prinzip oder Entwurfsmuster.

Bitte beachten Sie, dass es geringfügige Unterschiede zwischen dem Beispielprojekt und den Codebeispielen im Leitfaden geben kann. Um die Klarheit und Lesbarkeit zu verbessern, enthalten einige Beispiele vereinfachten Code wie öffentliche Felder.
Möglicherweise bevorzugt Ihr Team einen Kodierungsstil, der sich von den in diesem Leitfaden oder dem Beispielprojekt verwendeten Konventionen unterscheidet. Wir empfehlen, einen C#-Style-Guide zu erstellen, der auf Ihre spezifischen Bedürfnisse zugeschnitten ist, und ihn im gesamten Team konsequent zu befolgen. Mehr dazu erfahren Sie in unserem E-Book über die Erstellung eines eigenen Styleguides.
Sehen Sie sich die Beispiele an und entscheiden Sie, welches Entwurfsmuster am besten zu Ihren Projektanforderungen passt. Wenn Sie sich mit diesen Mustern vertraut machen, werden Sie deren Potenzial zur Rationalisierung und Verbesserung Ihrer Entwicklungsabläufe entdecken.
Sowohl das E-Book als auch das Beispielprojekt über die Verwendung von Entwurfsmustern stehen kostenlos zum Download bereit:
Viel Spaß beim Codieren!