Rolle eines Entitätsstatus in einem komponentenbasierten System?

8

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?

Paul Manta
quelle
5
Ich würde behaupten, dass es keine "endgültige Implementierung" gibt, da alle Spiele unterschiedliche Anforderungen haben und jede Entscheidung, die Sie beim Entwurf eines Systems treffen, ihre eigenen Kompromisse hat. Tun Sie einfach, was für Sie Sinn macht, und stellen Sie sicher, dass Sie eine Umgestaltung vornehmen, wenn die Dinge chaotisch werden.
Tetrad
@ The Communist Duck, war ein wenig niedrig ... haha
verlangsamt

Antworten:

9

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.

deft_code
quelle
2

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.

Evan Rogers
quelle
2

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

thelinuxlich
quelle
Ich bin ziemlich anderer Meinung als "keine Logik komplexer als Getter und Setter", aber ich komme aus dem Unity-Referenzrahmen, in dem alles eine Komponente ist. Ich würde denken, dass Komponenten in der Lage sein sollten, sich selbst zu verwalten.
Tetrad
1
Dies liegt daran, dass Unity nichts als Systeme an das Spiel selbst angehängt hat, die die Entitäten verarbeiten, deren Komponenten den Systemaspekt bilden.
Thelinuxlich