
Erste Schritte mit der Unity ScriptableObjects-Demo
Auf dieser Seite finden Sie einen Überblick über PaddleBallSO, das Begleitdemoprojekt für das E-Book „Create modular game architecture in Unity with ScriptableObjects“, und es wird erläutert, wie es Designmuster und Modularität in seiner Codearchitektur nutzt.
Dies ist die erste in einer Reihe von sechs Mini-Anleitungen, die Unity Entwickler bei der Demo zum E-Book unterstützen sollen. Die Demo ist von klassischen Ball- und Schläger-Arcade-Spielmechaniken inspiriert und zeigt, wie Sie mit ScriptableObjects Komponenten erstellen können, die testbar, skalierbar und designfreundlich sind.
Das E-Book, das Demoprojekt und diese Mini-Anleitungen bieten zusammen bewährte Verfahren für die Verwendung von Programmierdesignmustern mit der Klasse ScriptableObject in Ihrem Unity Projekt. Diese Tipps können Ihnen helfen, Ihren Code zu vereinfachen, die Speichernutzung zu reduzieren und die Wiederverwendbarkeit von Code zu fördern.
Diese Serie umfasst die folgenden Artikel:
Wichtiger Hinweis vor dem Start
Bevor Sie sich mit dem ScriptableObject-Demoprojekt und dieser Reihe von Mini-Anleitungen befassen, sollten Sie bedenken, dass Designmuster im Kern nur Ideen sind. Sie gelten nicht für jede Situation. Diese Techniken können Ihnen helfen, neue Wege für die Arbeit mit Unity und ScriptableObjects zu erlernen.
Jedes Muster hat Vor- und Nachteile. Wählen Sie nur die aus, die für Ihr spezifisches Projekt von Bedeutung sind. Verlassen sich Ihre Designer stark auf den Unity Editor? Ein ScriptableObject-basiertes Muster kann eine gute Wahl sein, um ihnen bei der Zusammenarbeit mit Ihren Entwicklern zu helfen.
Letztendlich ist die beste Code-Architektur die, die zu Ihrem Projekt und Team passt.

Das Paddelball-ScriptableObject-Projekt
PaddleBallSO konzentriert sich auf den Spieleklassiker, aus dem moderne Videospiele mit zwei Spielern, zwei Schlägern und einem Ball hervorgegangen sind.
Der Schwerpunkt liegt hier auf der Infrastruktur und nicht auf Spielmechaniken. Betrachten Sie dies als „Spieleinstallation“ – die weniger glamouröse, aber lebenswichtige Grundlage, die Ihre Anwendung am Laufen hält.
Dieses Projekt konzentriert sich darauf, wie ScriptableObjects hinter den Kulissen arbeiten können, um eine einheitliche Anwendung zu erstellen. Verwenden Sie sie, um vielseitige Spielsysteme zu konstruieren, die die Projektpflege vereinfachen und die Wiederverwendbarkeit von Code fördern können. Sie können sie auch für Spielerdaten, Spielzustandsmanagement, Spielverhalten und mehr verwenden.
Das PaddleBallSO-Projekt ist mit der neuesten Version des Unity Langzeit-Supports (LTS), derzeit 2022 LTS, kompatibel. Es enthält das UI Toolkit für die Erstellung der Laufzeit-UI und das Eingabesystem für die Handhabung der Benutzereingaben.

Erste Schritte
Suchen und laden Sie das Projekt im GitHub Repository herunter.
Laden Sie die Bootloader_scene oder aktivieren Sie im GameSystems-Menü die Bootstrap-Szene beim Spielen. Starten Sie den Play-Modus.
Obwohl diese nicht speziell für ScriptableObjects sind, verwendet das Demoprojekt einige gängige Techniken, um die Spielanwendung in einem konsistenten und vorhersehbaren Zustand zu starten.
Ein Scene Bootstrapper (oder Bootloader) ist ein Editor-Erweiterungsskript, das für die Einrichtung des Anfangszustands des Spiels verantwortlich ist. Dieser Initialisierungscode ist von der Spiellogik getrennt und stellt sicher, dass alle Abhängigkeiten für die Objekte in der Szene richtig eingerichtet sind.
Um Abhängigkeitsprobleme zu vermeiden, konfiguriert der Bootstrapper wesentliche Spielobjekte, Manager oder Dienste, wenn eine Szene geladen wird.
Wenn sich Ihre Unity Anwendung über mehrere Szenen erstreckt, kann der Bootloader das Laden einer bestimmten Bootstrap-Szene erzwingen, die die erste Szene aus den Build-Einstellungen ist. Beim Verlassen des Wiedergabemodus lädt der Editor die vorherige Szene neu.
Eine weitere Komponente in der Bootstrap-Szene, der Sequence Manager, kann dann wichtige Prefabs beim Laden der Szene instanziieren. In diesem spezifischen Demoprojekt ist alles, was Sie zur Erstellung des Spiels benötigen, ein Prefab, einschließlich einer Kamera, einem SplashScreen, Benutzeroberflächenmenüs und einem SceneLoader.
Der SceneLoader lädt dann bei Bedarf additiv alle Gameplay-Szenen. In den meisten Fällen bestehen diese Szenen hauptsächlich aus Prefabs.
Projektszenen
Jedes Minispiel-Level ist eine separate Unity Szene und erscheint in den Build-Einstellungen. Deaktivieren Sie den SceneBootstrapper im GameSystems-Menü, wenn Sie diese einzelnen Szenen erkunden möchten.
Viele Projekte enthalten auch einen Staging-Bereich für das Hauptmenü nach der Bootstrap-Szene. Bei diesem vereinfachten Demoprojekt wird eine Hauptmenüszene weggelassen.

Überblick über das PaddleBallSO-Projekt
Verwenden Sie die Play- und Pattern-Menüs, um PaddleBallSO zu testen, das Folgendes umfasst:
- Designmusterdemos oder mundgerechte Beispiele, die spezifische Techniken zeigen und jedes Muster isoliert veranschaulichen
- Minispiele, die diese zu funktionalen, funktionalen Beispielen kombinieren
Der Core-Ordner enthält nicht anwendungsspezifische Teile der Codebasis, wie z. B. die grundlegenden Musterskripts, Szenenmanagement und Benutzeroberflächenlogik. Dies sind allgemeinere Klassen, die für eine Vielzahl von Anwendungen gelten könnten.

Die Muster und das Minispiel erkunden
Das Beispielspiel stellt eine ikonische 2D Physiksimulation nach und zeigt das Potenzial von ScriptableObject-basierten Designmustern.
Bevor Sie in die Muster eintauchen, sollten Sie sich jedoch mit den MonoBehaviours vertraut machen, aus denen die Anwendung besteht. Wie zu erwarten, bestimmen Komponenten wie Paddle-, Ball-, Bouncer- und ScoreGoal-Skripte das einfache Gameplay.
Mehrere übergeordnete Manager-Skripte steuern den Spielfluss:
- Der GameManger kontrolliert die Spielzustände (Start, Ende, Zurücksetzen), initialisiert Spielkomponenten, verwaltet die Benutzeroberfläche und reagiert auf Ereignisse.
- Das GameSetup funktioniert mit dem GameManager, um den Ball, Schläger, Wände und Tore einzurichten.
- Der ScoreManager aktualisiert die Bewertungswerte, kümmert sich um Spielereignisse und steuert die Aktualisierungen der Benutzeroberfläche für die Ergebnisanzeige.
Diese MonoBehaviours funktionieren mit Ihren ScriptableObjects. Sie spielen eine entscheidende Rolle bei der Überbrückung dieser Komponenten, damit sie miteinander kommunizieren und Daten austauschen können.
Events dienen als Instrument für die Kommunikation zwischen verschiedenen Teilen des Projekts. Sie verbinden diese Manager-Skripte mit anderen Szenenobjekten und der Benutzeroberfläche. Diese ereignisgesteuerte Architektur kann dazu beitragen, Code organisierter und debuggbarer zu machen.
Wir haben auch vereinfachte Demobeispiele für jedes der gängigsten ScriptableObject-Muster bereitgestellt. Wenn Sie sich mit ihnen vertraut machen, werden Sie erkennen, wie ScriptableObjects die Architektur des Minispiels unterstützen.
Wir hätten das vorgestellte Minispiel mit viel weniger Codezeilen erstellen können, aber diese Demo konzentriert sich speziell auf Designmuster mit ScriptableObjects. Beachten Sie, dass Sie viele dieser Muster auch ohne ScriptableObjects implementieren können.
Entscheiden Sie als Team, wie die einzelnen Muster auf Ihr Projekt angewendet werden können, und wählen Sie den Ansatz aus, der für Sie am besten geeignet ist.

Modulare Spielarchitektur
Modularität in der Softwareentwicklung bedeutet, eine Anwendung in kleinere, unabhängigere Teile zu zerlegen. Diese Module dienen spezifischen Zwecken und können separat entwickelt und getestet werden.
Jeder kleine Satz von Objekten funktioniert als eine Einheit und behandelt einen Aspekt des Spiels. Dies kann alles Mögliche sein, von der Kontrolle der Spielereingabe über den Umgang mit der Physik bis hin zur Bewertung des Ergebnisses.
Achten Sie beim Erkunden der Projektskripte auf die folgenden wichtigen Erkenntnisse:
- Bauen Sie Ihre Szenen aus Prefabs auf: Sie werden feststellen, dass die meisten Szenen im Projekt einfach Sammlungen von Prefabs mit minimalen Überschreibungen sind. Prefabs bieten von Natur aus eine gewisse Modularität. Die Fehlerbehebung bei einer Funktion wird zur Frage des isolierten Testens des jeweiligen Prefab. Prefabs sind wie ScriptableObjects Assets auf Projektebene, die über mehrere Szenen hinweg wiederverwendet und geteilt werden können.
- Nutzung von ScriptableObjects zur Datenspeicherung (und mehr): Vermeiden Sie die Verwendung von MonoBehaviours zum Speichern statischer Gameplay-Daten. Nutzen Sie stattdessen ScriptableObjects für eine bessere Wiederverwendbarkeit. Sie können auch bestimmte Spiellogiken an ScriptableObjects delegieren oder sie die Kommunikation zwischen Ihren Szenenobjekten erleichtern lassen.
- Einzelne Bedenken: Achten Sie auf eine klare Unterscheidung zwischen Daten, Logik und Benutzeroberfläche in Ihrem Projekt. Dies verbessert die Wartbarkeit des Codes und vereinfacht das Debugging. Unser Menübildschirmsystem nutzt das neuere UI Toolkit. Dieses Benutzeroberflächensystem erzwingt einen Workflow, der die Schnittstelle von der zugrunde liegenden Logik trennt. Weitere Einzelheiten finden Sie im E-Book Benutzeroberflächendesign und -implementierung in Unity.
- Abhängigkeiten minimieren: Die Reduzierung von Abhängigkeiten zwischen Komponenten erleichtert es, Teile Ihres Projekts zu ändern oder zu ersetzen, ohne dass unvorhergesehene Probleme auftreten.
- Veranstaltungen für die Kommunikation nutzen: Ereignisse ermöglichen eine lose Kopplung zwischen den Komponenten, sodass sie sich Nachrichten ohne direkte Abhängigkeiten senden können. Sie können sie mit ScriptableObject-basierten „Event-Kanälen“ weiter entkoppeln.
- Vermeiden Sie unnötige Singletons: Singleton-Designmuster können nützlich sein, aber nur, wenn eine einzelne Instanz einer Klasse unerlässlich ist. Die Übernutzung von Singletons kann zu eng gekoppeltem Code führen und das Testen behindern. Überspringen Sie das Singleton, wenn es nicht benötigt wird.
Das Refactoring eines großen monolithischen Skripts in kleinere Teile fördert die Wiederverwendbarkeit und Skalierbarkeit. Dies führt zu einer verbesserten Zusammenarbeit im Team und vereinfachten Tests.

ScriptableObjects bei der Arbeit
Wir haben das PaddleBallSO-Projekt erstellt, um Anwendungsfälle für ScriptableObject zu demonstrieren. Hier sind einige Orte, an denen Sie sie in Aktion sehen können:
- Das GameDataSO ScriptableObject dient als zentraler Datencontainer für Spieleinstellungen. Bearbeiten Sie Ihre gängigen Daten einmal und teilen Sie sie dann mit den anderen Objekten, die sie benötigen.
- Die Minispiele sind auf zahlreiche Veranstaltungskanäle angewiesen, um entkoppelt zu kommunizieren. Diese ScriptableObject-basierten Ereignisse bilden das Rückgrat der Art und Weise, wie sich Objekte Nachrichten senden.
- Die Tonwiedergabe nutzt ein ScriptableObject-basiertes Delegatenobjekt, um die Logik von der MonoBehaviour Komponente zu trennen.
- Wir verwenden ein PlayerIDSO ScriptableObject-basiertes Enum, um „Teams“ zwischen Player1 und Player2 zu unterscheiden.
- Das LevelLayoutSO ScriptableObject dient als Datencontainer für die Startpositionen von Spielelementen wie Schlägern, Toren, Wänden und Ball. Dies ermöglicht die einfache Anpassung von Levellayouts innerhalb von Unity und extern über exportierte JSON-Dateien. Das Modding von Leveldesigns außerhalb von Unity kann die Kreativität der Spieler und das Teilen benutzerdefinierter Layouts fördern.
Sehen Sie sich unbedingt auch die Designmusterdemos an, um ein paar Extras zu erhalten!

6 bewährte Verfahren für ScriptableObjects
ScriptableObjects können zwar ein leistungsstarkes Tool zum Speichern von Spieldaten und Optimieren Ihres Workflows sein, aber es ist unerlässlich, sie effektiv zu nutzen, um Unordnung in Ihrem Projekt zu vermeiden.
Hier finden Sie einige bewährte Verfahren für die Verwendung von ScriptableObjects in Unity:
- Daten modular und organisiert halten: Verwenden Sie separate ScriptableObjects für verschiedene Datentypen (z. B. eines für Spielerstatistiken, eines für Feindverhalten usw.). Zerlegen Sie komplexe Daten in kleinere Teile, die einfach verwaltet werden können.
- Ordner und Namenskonventionen verwenden: ScriptableObjects können dazu beitragen, den Code in Ihren Skripten zu reduzieren, aber der Kompromiss besteht darin, dass Sie mehr Assets in Ihren Projektordnern haben. Eine angemessene Namensgebung und Verzeichnisorganisation kann dabei helfen, diese ScriptableObjects effizient zu verwalten. Tipps zur Namensgebung finden Sie in unserem Codestil-Leitfaden.
- Vermeiden Sie übermäßigen Einsatz von ScriptableObjects: ScriptableObjects sind fantastische Datencontainer, aber es ist wichtig, dass Sie sie nicht übermäßig verwenden. Beachten Sie, dass ScriptableObjects Ihrem Projekt zusätzliche Komplexität verleihen können. Stellen Sie sie also nur dann bereit, wenn sie einen klaren Vorteil bieten. (Nutzen Sie sie beispielsweise nicht zum Speichern persistenter Daten.)
- Sichern Sie Daten regelmäßig: Änderungen an ScriptableObjects erfolgen „live“ zur Laufzeit und werden als Asset-Dateien gespeichert. Sichern Sie Ihr Projekt regelmäßig, um Datenverluste zu vermeiden. Verwenden Sie Version Control Software, um Änderungen an Ihren ScriptableObjects zu verfolgen.
- Nutzen Sie das Inspector-Fenster: Ein wesentlicher Vorteil von ScriptableObjects ist, dass sie serialisierbar sind und im Inspector angezeigt werden. Nutzen Sie die Editor-Schnittstelle, um Daten anzuzeigen und zu manipulieren, die in ScriptableObjects gespeichert sind.
- Nutzen Sie benutzerdefinierte Editor-Skripte zu Ihrem Vorteil: ScriptableObjects können nicht nativ auf Laufzeitobjekte aus der Szenenhierarchie verweisen. Verwenden Sie Editor Scripting, um den Inspector benutzerfreundlicher zu gestalten, wenn Sie diese Objekte visualisieren müssen.
Wenn Sie diese Richtlinien befolgen, vermeiden Sie gängige Fallstricke bei der Entwicklung.

Weitere ScriptableObject-Ressourcen
Lesen Sie mehr über Designmuster mit ScriptableObjects im E-Book Erstellen Sie modulare Spielarchitektur in Unity mit ScriptableObjects. Weitere Informationen zu gängigen Designmustern in der Unity-Entwicklung finden Sie im E-Book. Verbessern Sie Ihren Code mit Spielprogrammierungsmustern.