• Spiele
  • Branche
  • Ressourcen
  • Community
  • Lernen
  • Support
Entwicklung
Unity Engine
Erstellen Sie 2D- und 3D-Spiele für jede Plattform
HerunterladenAbonnements und Preise
Monetarisierung
In-App-Kauf (IAP)
Entdecken und verwalten Sie IAP über die Stores
Mediation
Maximieren Sie den Umsatz und optimieren Sie die Monetarisierung
Anzeigenqualität
Schützen Sie das Benutzererlebnis Ihrer App
Tapjoy
Langfristige Benutzerloyalität aufbauen
Alle Monetarisierungsprodukte
Nutzerakquisition
Nutzerakquisition
Entdecken Sie und gewinnen Sie mobile Benutzer
Unity Vector AI
Verbinden Sie Spieler mit den richtigen Spielen
Aura On-Device-Werbung
Erreichen Sie Benutzer auf dem Gerät zur Spitzenzeit der Interaktion
Alle Wachstumsprodukte
Anwendungsfälle
3D-Zusammenarbeit
Erstellen und überprüfen Sie 3D-Projekte in Echtzeit
Immersive Schulung
In immersiven Umgebungen trainieren
Kundenerlebnisse
Interaktive 3D-Erlebnisse erstellen
Alle branchenspezifischen Lösungen
Branchen
Fertigung
Betriebliche Exzellenz erreichen
Einzelhandel
In-Store-Erlebnisse in Online-Erlebnisse umwandeln
Automobilindustrie
Innovation und In-Car-Erlebnisse steigern
Alle Branchen
Technische Bibliothek
Dokumentation
Offizielle Benutzerhandbücher und API-Referenzen
Entwicklertools
Versionsfreigaben und Fehlerverfolgung
Roadmap
Bevorstehende Funktionen überprüfen
Glossar
Bibliothek technischer Begriffe
Einblicke
Fallstudien
Erfolgsgeschichten aus der Praxis
Best-Practice-Leitfäden
Experten Tipps und Tricks
Alle Ressourcen
Neues
Blog
Aktualisierungen, Informationen und technische Tipps
Neuigkeiten
Nachrichten, Geschichten und Pressezentrum
Community Hub
Diskussionen
Diskutieren, Probleme lösen und verbinden
Veranstaltungen
Globale und lokale Veranstaltungen
Gemeinschaftsgeschichten
Made with Unity
Präsentation von Unity-Schöpfern
Livestreams
Schließen Sie sich Entwicklern, Kreativen und Insidern an
Unity Awards
Feier der Unity-Schöpfer weltweit
Für jedes Niveau
Unity Learn
Meistern Sie Unity-Fähigkeiten kostenlos
Professionelles Training
Verbessern Sie Ihr Team mit Unity-Trainern
Neu bei Unity
Erste Schritte
Beginnen Sie noch heute mit dem Lernen
Unity Essential Pathways
Sind Sie neu bei Unity? Starten Sie Ihre Reise
Anleitungen
Umsetzbare Tipps und bewährte Verfahren
Bildung
Für Studierende
Starten Sie Ihre Karriere
Für Lehrkräfte
Optimieren Sie Ihr Lehren
Lizenzstipendium für Bildungseinrichtungen
Bringen Sie die Kraft von Unity in Ihre Institution
Zertifizierungen
Beweisen Sie Ihre Unity-Meisterschaft
Kundendienstoptionen
Hilfe erhalten
Wir helfen Ihnen, mit Unity erfolgreich zu sein
Erfolgspläne
Erreichen Sie Ihre Ziele schneller mit Expertenunterstützung
FAQ
Antworten auf häufige Fragen
Kontakt aufnehmen
Verbinden Sie sich mit unserem Team
Abonnements und Preise
Sprache
  • English
  • Deutsch
  • 日本語
  • Français
  • Português
  • 中文
  • Español
  • Русский
  • 한국어
Sozial
Währung
Kaufen
  • Produkte
  • Unity Ads
  • Abonnement
  • Unity Asset Store
  • Wiederverkäufer
Bildung
  • Schüler/Studierende
  • Lehrkräfte
  • Einrichtungen
  • Zertifizierung
  • Learn
  • Programm zur Entwicklung von Fähigkeiten
Herunterladen
  • Unity Hub
  • Datei herunterladen
  • Beta-Programm
Unity Labs
  • Labs
  • Veröffentlichungen
Ressourcen
  • Lernplattform
  • Community
  • Dokumentation
  • Unity QA
  • FAQ
  • Status der Dienste
  • Fallstudien
  • Made with Unity
Unity
  • Unser Unternehmen
  • Newsletter
  • Blog
  • Veranstaltungen
  • Stellenangebote
  • Hilfe
  • Presse
  • Partner
  • Investoren
  • Partner
  • Sicherheit
  • Social Impact
  • Inklusion & Vielfalt
  • Kontakt aufnehmen
Copyright © 2025 Unity Technologies
  • Rechtliches
  • Datenschutzrichtlinie
  • Cookies
  • Verkaufen oder teilen Sie nicht meine personenbezogenen Daten

"Unity", Unity-Logos und sonstige Marken von Unity sind Marken oder eingetragene Markenzeichen von Unity Technologies oder den zugehörigen verbundenen Unternehmen in den USA und anderen Ländern (weitere Informationen finden Sie hier). Alle anderen Namen oder Marken sind Marken ihrer jeweiligen Eigentümer.

Hero background image

Verwenden Sie ScriptableObjects als Delegatobjekte

Diese Website wurde aus praktischen Gründen für Sie maschinell übersetzt. Die Richtigkeit und Zuverlässigkeit des übersetzten Inhalts kann von uns nicht gewährleistet werden. Sollten Sie Zweifel an der Richtigkeit des übersetzten Inhalts haben, schauen Sie sich bitte die offizielle englische Version der Website an.
Klicken Sie hier.

Diese Seite erklärt, wie man ScriptableObjects als Logikcontainer verwendet. Indem Sie dies tun, können Sie sie als Delegatobjekte oder kleine Bündel von Aktionen behandeln, die Sie bei Bedarf aufrufen können.

Dies ist der vierte in einer Reihe von sechs Mini-Guides, die erstellt wurden, um Unity-Entwicklern mit der Demo zu helfen, die das E-Book Modulare Spielarchitektur in Unity mit ScriptableObjects erstellen begleitet.

Die Demo ist inspiriert von klassischen Ball- und Paddle-Arcade-Spielmechaniken und zeigt, wie ScriptableObjects Ihnen helfen können, Komponenten zu erstellen, die testbar, skalierbar und designerfreundlich sind.

Zusammen bieten das E-Book, das Demoprojekt und diese Mini-Guides bewährte Praktiken für die Verwendung von Programmierdesignmustern mit der ScriptableObject-Klasse in Ihrem Unity-Projekt. Diese Tipps können Ihnen helfen, Ihren Code zu vereinfachen, den Speicherverbrauch zu reduzieren und die Wiederverwendbarkeit des Codes zu fördern.

Diese Serie umfasst die folgenden Artikel:

  • Beginnen Sie mit der Unity ScriptableObjects-Demo
  • Trennen Sie Spieldaten und Logik mit ScriptableObjects
  • Verwenden Sie ScriptableObject-basierte Enums in Ihrem Unity-Projekt
  • Verwenden Sie ScriptableObjects als Ereigniskanäle im Spielcode
  • Wie man ein ScriptableObject-basiertes Laufzeitsatz verwendet
  • Wichtiger Hinweis, bevor Sie beginnen
  • Das Strategiemuster
  • Steckbare Verhalten
  • Beispiel: AudioDelegate
  • Muster-Demo
  • Beispiel: Strategiemuster im objektiven System
  • Weitere ScriptableObject-Ressourcen

Wichtiger Hinweis, bevor Sie beginnen

Bevor Sie in das ScriptableObject-Demo-Projekt und diese Reihe von Mini-Anleitungen eintauchen, denken Sie daran, dass Designmuster im Kern nur Ideen sind. Sie sind nicht auf jede Situation anwendbar. Diese Techniken können Ihnen helfen, neue Wege zu finden, um mit Unity und ScriptableObjects zu arbeiten.

Jedes Muster hat Vor- und Nachteile. Wählen Sie nur die, die Ihrem spezifischen Projekt sinnvoll zugutekommen. Verlassen sich Ihre Designer stark auf den Unity Editor? Ein auf ScriptableObject basierendes Muster könnte eine gute Wahl sein, um ihnen die Zusammenarbeit mit Ihren Entwicklern zu erleichtern.

Letztendlich ist die beste Code-Architektur die, die zu Ihrem Projekt und Ihrem Team passt.

ScriptableObjects
EIN SCRIPTABLEOBJECT ENTHÄLT DIE "STRATEGIE" INNERHALB DES MONOBEHAVIOUR.

Das Strategiemuster

Mit dem Strategiemuster können Sie eine Schnittstelle oder eine Basis-ScriptableObject-Klasse definieren und diese Delegatobjekte zur Laufzeit austauschbar machen.

Eine Anwendung besteht darin, Algorithmen für spezifische Aufgaben in einem ScriptableObject zu kapseln und dieses ScriptableObject dann im Kontext von etwas anderem zu verwenden.

Wenn Sie beispielsweise ein KI- oder Pfadsuchsystem für eine EnemyUnit-Klasse schreiben würden, könnten Sie ein ScriptableObject mit einer Pfadsuchtechnik (wie A*, Dijkstra usw.) erstellen.

Die EnemyUnit selbst würde tatsächlich keine Pfadsuchlogik enthalten. Stattdessen würde sie eine Referenz auf ein separates "Strategie"-ScriptableObject behalten. Der Vorteil dieses Designs ist, dass Sie einfach durch den Austausch von Objekten zu einem anderen Algorithmus wechseln können. Dies ist eine Möglichkeit, zur Laufzeit unterschiedliche Verhaltensweisen auszuwählen.

Wenn das MonoBehaviour eine Aufgabe ausführen muss, ruft es die externen Methoden des ScriptableObject anstelle seiner eigenen auf. Das ScriptableObject könnte beispielsweise öffentliche Methoden für BewegeEinheit oder ZielSetzen enthalten, um die feindliche Einheit zu steuern und ein Ziel anzugeben.

Download PaddleBallSO

Steckbare Verhalten

Sie können dieses Muster mit einer abstrakten Basisklasse oder einer Schnittstelle verbessern. Das bedeutet, dass jedes ScriptableObject, das die Strategie implementiert, mit einem anderen ausgetauscht werden kann. Dieses hot-swappable ScriptableObject "steckt" in das MonoBehaviour, das darauf verweist – sogar zur Laufzeit.

Wenn du möchtest, dass die EnemyUnit ihr Verhalten aufgrund von Spielbedingungen ändert, kann der äußere Kontext (das MonoBehaviour) nach diesen Bedingungen prüfen. Dann kann es ein anderes ScriptableObject als Antwort einfügen.

Durch die Trennung der Implementierungsdetails in ein ScriptableObject kannst du auch eine bessere Aufteilung der Verantwortlichkeiten in deinem Team ermöglichen. Ein Entwickler könnte sich auf den Algorithmus im ScriptableObject konzentrieren, während ein anderer am MonoBehaviour-Kontext arbeitet.

Um dieses pluggable Verhalten zu erstellen, stelle sicher, dass du:

  • Eine Basisklasse oder ein Interface für die Strategie definierst: Diese Klasse oder dieses Interface sollte die Methoden und Eigenschaften enthalten, die benötigt werden, um die Strategie auszuführen.
  • Die ScriptableObject-Klassen erstellen: Jede kann unterschiedliche Implementierungen der Strategie bereitstellen. Zum Beispiel könntest du eine Klasse erstellen, die einen einfachen KI-Algorithmus implementiert, und eine andere Klasse, die einen komplexeren Algorithmus implementiert.
  • Ein ScriptableObject erstellen, das die Strategie implementiert: Fülle die fehlende Logik aus und befülle den Inspector mit allen notwendigen Werten.
  • Die Strategie im Kontext verwenden: Im MonoBehaviour ruf die Methoden und Eigenschaften auf, die im ScriptableObject implementiert sind. Um das Aufrufen dieser Methoden zu erleichtern, übergebe die Abhängigkeiten als Parameter.

Deinen Code so zu organisieren, kann es einfacher machen, zwischen verschiedenen Implementierungen derselben Strategie zu wechseln. Dieses pluggable Verhalten wird dann einfacher zu debuggen und zu warten.

Beispiel: AudioDelegate

Ein Algorithmus oder eine Strategie muss nicht kompliziert sein. Das PaddleBallSO Projekt demonstriert beispielsweise ein ziemlich einfaches Audio-Wiedergabesystem im SimpleAudioDelegate.

Die abstrakte Klasse AudioDelegateSO definiert eine einzelne Play-Methode, die einen AudioSource-Parameter akzeptiert. Die konkrete Implementierung überschreibt dies dann.

Die SimpleAudioDelegateSO Unterklasse definiert ein Array von AudioClips. Es wählt einen zufälligen Clip aus und spielt ihn mit der überschriebenen Play Methodenimplementierung ab. Dies fügt eine Variation in Tonhöhe und Lautstärke innerhalb eines benutzerdefinierten Bereichs hinzu.

Obwohl es nur ein paar Zeilen sind, können Sie mit dem folgenden Code-Snippet viele verschiedene Audioeffekte erzeugen.

Während dieses spezifische Beispiel nicht wirklich für intensive Audio-Nutzung geeignet ist, wird es hier als grundlegende Anwendungsdemonstration von ScriptableObjects in einem Strategie-Muster präsentiert.

Ein Designer kann viele verschiedene ScriptableObjects erstellen, um Soundeffekte darzustellen, ohne den Code zu berühren. Wieder erfordert dies minimale Unterstützung von einem Entwickler, sobald das Basis-ScriptableObject abgeschlossen ist.

In PaddleBallSO kann jetzt jeder ein neues Array von Klängen einrichten, die abgespielt werden, wenn der Ball eine der Levelwände trifft. Designer gewinnen kreative Unabhängigkeit und Flexibilität, da sie vollständig im Editor arbeiten. Dieser Ansatz entlastet die Programmierressourcen, da Entwickler nicht mehr bei jeder Designentscheidung helfen müssen.

Download PaddleBallSO
Delegatobjekte
DIE AUDIODELEGATES DEMO-SZENE ZEIGT, WIE SCRIPTABLEOBJECTS LOGIK HALTEN KÖNNEN.

Muster-Demo

Sie können das Audio-Beispiel auch in der Patterns-Demo sehen. Jeder Sound stammt von einem leicht unterschiedlichen SimpleAudioDelegateSO-Asset, mit kleinen Variationen zwischen den Instanzen.

In diesem Beispiel enthält jede Ecke einen AudioSource. Ein benutzerdefinierter AudioModifier MonoBehaviour verwendet einen auf ScriptableObject basierenden Delegaten, um den Sound abzuspielen.

Die Unterschiede in der Tonhöhe ergeben sich nur aus den Einstellungen auf jedem ScriptableObject-Asset (BeepHighPitched_SO, BeepLowPitched_SO usw.).

Die Verwendung eines ScriptableObject zur Steuerung der Aktionslogik kann es Ihrem Designteam erleichtern, mit Ideen zu experimentieren. Dies ermöglicht es einem Designer, unabhängiger von einem Entwickler zu arbeiten.

Zielmanager
DER OBJECTIVEMANAGER MONOBEHAVIOUR TESTET GEWINNBEDINGUNGEN MIT SCRIPTABLEOBJECTS.

Beispiel: Strategiemuster im objektiven System

Das PaddleBallSO Projekt verwendet ebenfalls das Strategiemuster in seinem Zielsystem. Obwohl dies nichts ist, was zur Laufzeit variieren muss, bietet die Kapselung jedes Objekts in einem ScriptableObject eine flexible Möglichkeit, Gewinn- und Verlustbedingungen zu testen.

Die abstrakte Basisklasse, ObjectiveSO, hält Werte wie den Namen des Ziels und ob es abgeschlossen wurde.

Die konkreten Unterklassen, wie ScoreObjectiveSO, implementieren dann die tatsächliche Logik, wie jedes Ziel erreicht wird. Sie tun dies, indem sie die CompleteObjective Methode von ObjectiveSO überschreiben und die Logik für die Gewinnbedingung hinzufügen.

Muss der Spieler eine bestimmte Punktzahl erreichen oder eine bestimmte Anzahl von Feinden besiegen? Müssen sie einen bestimmten Ort erreichen oder einen bestimmten Gegenstand aufheben? Dies sind gängige Gewinnbedingungen, die zu ScriptableObject-basierten Zielen werden könnten.

Der ObjectiveManager dient als der größere Kontext für die ScriptableObjects. Er verwaltet eine Liste von ObjectiveSOs und verlässt sich auf jedes ScriptableObject, um zu bestimmen, ob es abgeschlossen ist. Wenn jedes ObjectiveSO einen Abschlusszustand zeigt, ist das Spiel vorbei.

Zum Beispiel zeigt das ScoreObjectiveSO eine Möglichkeit, ein Punktziel zu implementieren:

  • Eine benutzerdefinierte PlayerScore Struktur entspricht der Spieler-ID, einem UI-Element in der Benutzeroberfläche, und dem tatsächlichen Punktwert.
  • Jedes Mal, wenn die ScoreManager-Komponente aktualisiert wird, überprüft das Ziel die Gewinnbedingung.
  • Wenn die Punktzahl des Spielers die m_TargetScore erreicht oder übersteigt, sendet es das gewinnende PlayerScore-Objekt als Ereignis.

Der ObjectiveManager kümmert sich nur darum, dass alle gegebenen Ziele abgeschlossen sind. Es ist sich der Details innerhalb jedes Ziels selbst nicht bewusst.

Das Ziel hier ist erneut Modularität. Dies ermöglicht es Ihnen, jedes ObjectiveSO anzupassen, ohne bestehende zu beeinflussen.

Das PaddleBallSO Spiel hat wirklich nur ein Ziel. Wenn einer der Spieler das Gewinnziel erreicht, endet das Spiel.

Sie könnten dies jedoch erweitern oder Ziele kombinieren, um ein komplexeres Zielsystem zu erstellen. Experimentieren Sie und sehen Sie, ob Sie neue Spielmodi erstellen können (z. B. eine Mindestanzahl von Punkten erzielen, bevor die Zeit abläuft).

Da die Logik in einem ScriptableObject gekapselt ist, können Sie jedes ObjectiveSO gegen ein anderes austauschen. Eine neue Gewinnbedingung zu erstellen, bedeutet einfach, die Liste im ObjectiveManager neu zu konfigurieren. In gewissem Sinne ist das Ziel "steckbar" in den umgebenden Kontext.

Beachten Sie, dass ein praktischer Aspekt des ObjectiveSO das Ereignis ist, das verwendet wird, um Nachrichten zwischen GameObjects zu senden. Als nächstes werden wir erkunden, wie man ScriptableObjects verwendet, um diese ereignisgesteuerte Architektur zu implementieren.

Download PaddleBallSO
scriptable outro

Weitere ScriptableObject-Ressourcen

Lesen Sie mehr über Entwurfsmuster mit ScriptableObjects im E-Book Create modular game architecture in Unity with ScriptableObjects. Sie können auch mehr über gängige Entwurfsmuster in der Unity-Entwicklung in Level up your code with game programming patterns erfahren.