Komponentenbasierte Entitätssysteme sind heutzutage der letzte Schrei. Alle scheinen zuzustimmen, dass sie der richtige Weg sind, aber niemand hat wirklich eine endgültige Implementierung eines solchen Systems. Ich habe mich gefragt, welche Rolle Entitätszustände (links gehen, stehen, springen usw.) in einem CBS spielen. Verhalten sie sich wie Controller (dh sie behandeln Ereignisse und ändern die Attribute der Entität basierend auf diesen Ereignissen)?
Was ist mit Fällen, in denen ein Status beispielsweise erfordern würde, dass die Entität in den No-Clip-Modus wechselt? Sollte dieser Status beim Eintritt möglicherweise die CollisionComponent der Entität auf einen Nullzeiger oder etwas anderes setzen? (Beim Beenden sollte der Status die CollisionComponent der Entität auf ihren vorherigen Status zurücksetzen.)
Ich denke auch, dass es die Aufgabe des aktuellen Status ist, den Status der Entität in etwas anderes zu ändern, oder?
quelle
Antworten:
Ich hatte den Eindruck, dass in einem komponentenbasierten Design die Entitäten im Wesentlichen Komponentencontainer sind (mit möglicherweise einer Nachricht). Aus dieser Perspektive betrachtet würden die einzelnen Komponenten ein wenig vom Zustand speichern. Wenn die Geisterverhaltenskomponenten beispielsweise entscheiden, dass sie in den immateriellen Modus wechseln müssen, sendet sie auch eine Nachricht an die Physikkomponente, in der sie aufgefordert wird, kein Clip zu aktivieren. Es würde wahrscheinlich auch eine Nachricht an die Ghost-Model-Komponenten senden, die besagt, dass das Alpha hochgefahren werden soll.
quelle
Zustandsmaschinen und Komponenten sind orthogonale Techniken. Sie können Zustände in Ihren Komponenten haben oder nicht, genauso wie Sie Zustände in jeder Klasse haben können. Sie können eine Komponente beobachten lassen (siehe Beobachtermuster) und den Status einer anderen Komponente ändern. Zustandsautomaten haben viele Verwendungszwecke und die Implementierung hängt von Ihren Anforderungen ab.
Für den Charakter, den Sie beschrieben haben (Gehen, Stehen, Springen), habe ich Implementierungen gesehen, bei denen die verschiedenen Komponenten alle ihre eigenen Zustandsmaschinen beibehalten ... Physik, Animation, Steuerung, ai. Die Komponenten sollten eine klare Autorität darüber haben, auf welche anderen Komponenten sie reagieren und welche Komponentenzustände sie ändern können.
quelle
Designkomponenten als Strukturen nur mit Daten, keine Logik komplexer als Getter und Setter. Erstellen Sie keine Abhängigkeiten zwischen Komponenten, da Sie sonst die meisten Vorteile eines Entitätssystems verlieren.
Ein Beispiel für diesen Ansatz (in der Nähe der T-Machine Vision) finden Sie hier: https://github.com/thelinuxlich/starwarrior_CSharp
Und der Motor selbst: https://github.com/thelinuxlich/artemis_CSharp
quelle