Ich arbeite an einem Spiel mit einer komponentenbasierten Architektur. A Entity
besitzt eine Reihe von Component
Instanzen, von denen jede über eine Reihe von Slot
Instanzen verfügt, mit denen Werte gespeichert, gesendet und empfangen werden können. Factory-Funktionen wie das Player
Erstellen von Objekten mit den erforderlichen Komponenten und Steckplatzverbindungen.
Ich versuche, die bestmögliche Granularität für Komponenten zu ermitteln. Zum Beispiel gerade jetzt Position
, Velocity
und Acceleration
sind alle einzelnen Komponenten, die in Reihe geschaltet. Velocity
und Acceleration
könnte leicht in eine einheitliche Delta
Komponente umgeschrieben werden , oder Position
, Velocity
und Acceleration
könnte neben solchen Komponenten als Friction
und Gravity
in eine monolithische Physics
Komponente kombiniert werden.
Sollte eine Komponente die geringstmögliche Verantwortung tragen (auf Kosten einer Vielzahl von Verbindungsmöglichkeiten) oder sollten zugehörige Komponenten zu monolithischen Komponenten kombiniert werden (auf Kosten der Flexibilität)? Ich neige mich zu ersteren, aber ich könnte eine zweite Meinung gebrauchen.
quelle
Antworten:
Es gibt eine Grenze zwischen vollständiger Granularität, die zu keiner Verschwendung von Code oder einem blobartigen Zustand führt (weshalb Komponentenarchitekturen bevorzugt werden), und Benutzerfreundlichkeit.
Offensichtlich mögen die Dinge eine haben
Position
, aber sie sind nicht unbedingt dynamisch (also warum habenVelocity
undAcceleration
?). Allerdings wird etwas mit aVelocity
ein sich bewegendes Objekt sein, daher ist es sinnvoll, es auchAcceleration
gruppiert zu haben .Haben Sie einen Fall, in dem v und a benötigt werden, möchten aber keine Physiksimulation für sie?
Gravity
Wird es auch einen Punkt geben, wenn es sich nicht um physikalische Objekte handelt?Gruppe, was Sinn macht.
quelle
Entity
aPosition
und einige Komponenten vorhanden sind, die zurPosition
Teilnahme an der Physik beitragen,Entity
ist das de facto physisch. Ich denke, ich kann nur einige Komponenten für die logische Gruppierung hinzufügen und alle grundlegenden Komponenten in einer Verantwortung zusammenfassen. So das Hinzufügen, sagen wir, einMovable
zu einerEntity
hätte die gleiche Wirkung wie das Hinzufügen einesPosition
,Velocity
undAcceleration
.Um zu vermeiden, dass jede einzelne Variable, die ich vorschlagen würde, durch einen schweren Start verwaltet wird, wählen Sie eine Unterteilung nach Verantwortlichkeit und Refaktor, wenn sich die Situation logisch darstellt. Sie können die ersten Entwürfe auf Papier beginnen. Irgendwann werden diese groben Verantwortungsbereiche die Bausteine Ihrer Einheiten.
Für ein überstürztes Beispiel haben Sie also ein Spiel. Das Spiel teilt sich in Environment + State. Die Umgebung wird in StaticWorld + MovingStuff aufgeteilt. Der Status wird in AIControlled + PlayerControlled aufgeteilt. Die grobe Idee des Schadens teilt sich in TakesDamage + GivesDamage.
Und so weiter.
Ähnlich wie der übliche Ratschlag "Spiele bauen, keine Engines!" Für Anfänger empfehle ich "Build Games, keine ausgefeilten Komponentensysteme!" denn nur mit persönlicher erfahrung mit einem laufspiel wissen sie, ob in zukünftigen arbeiten ein ausgeklügeltes komponentensystem gefragt ist.
quelle
Meine Vermutung wäre, Komponenten zu kombinieren, die viel Interaktion haben werden. In Ihrem Fall würde ich die Position in einer einzelnen Komponente halten und die Geschwindigkeit und Beschleunigung in einer Physikkomponente zusammenhalten.
Es hängt jedoch stark von Ihren Spielfunktionen ab (es sei denn, Sie erstellen ein Framework, das kein bestimmtes Spiel im Auge hat).
quelle
Mir ist klar, dass dies eine alte Frage ist, aber vielleicht wird jemand diese Antwort nützlich finden.
Ich glaube, das
Systems
wird Ihnen helfen, das Konstruieren von Komponenten besser zu verstehen. Systeme existieren in Architekturen, in denen Komponenten, abgesehen von einfachen Get- / Setter- und Hilfsfunktionen, keine eigene Logik enthalten. Systeme arbeiten mit Entitäten, die die Komponentenanforderungen erfüllen. Aus diesem Grund ist es am besten, Komponentendaten so weit zu trennen, wie es sinnvoll ist, diese Daten ohne die anderen Daten zu verarbeiten.Zum Beispiel könnten Sie einen haben,
MovementSystem
der die EntitiesPosition
basierend auf deren aktualisiertVelocity
. Dies könnte für einfache Einheiten im Spiel sein. Aber für den Spieler und die Feinde möchten Sie vielleicht eine Bewegung,Acceleration
die verarbeitet wirdAcceleratedMovementSystem
. Aber für Hindernisse möchten Sie vielleichtFriction
. Das Terrain hat möglicherweise auch Reibung, aber keine Geschwindigkeitskomponente. Aber was ist mitGravity
? Füge es einfach hinzu, Spieler, Feind und Hindernis, und erstelle einGravitySystem
, um es zu verarbeiten.Das Fazit ist, je entkoppelter Sie
Components
sind, desto erweiterbarer ist dieEntities
VerwendungSystems
.Edit: Letzte Aussage deutlicher gemacht.
Edit: Ok, ich habe an meinem eigenen System gearbeitet und bin zu dieser Erkenntnis gekommen. Ein Beispiel für die Aufteilung von Position und Geschwindigkeit ist, dass durch die Manipulation der Geschwindigkeit die Position mit einem MovementSystem geändert wird. Infolgedessen benötigt ein 'InputMovementSystem' keine Position, um den Player von Benutzereingaben aus zu bewegen, da das MovementSystem die Änderungen in der Geschwindigkeit aufnimmt, die auf die Position angewendet werden sollen. Zugegeben, es würde immer noch gut funktionieren, sie zusammenzusetzen, aber das ist ein Beispiel dafür, warum das nicht so sein muss.
Ich habe kürzlich einen Blogbeitrag gelesen, der ungefähr so aussah:
quelle