Zustandsautomaten scheinen schädliche Abhängigkeiten in komponentenbasierten Architekturen zu verursachen.
Wie wird konkret die Kommunikation zwischen einer Zustandsmaschine und den Komponenten gehandhabt, die zustandsbezogenes Verhalten ausführen?
Wo ich bin:
- Ich bin neu in komponentenbasierten Architekturen.
- Ich mache ein Kampfspiel, obwohl ich nicht denke, dass das wichtig sein sollte. Ich stelle mir vor, dass meine Zustandsmaschine verwendet wird, um Zustände wie "ducken", "stürzen", "blockieren" usw. umzuschalten.
- Ich habe festgestellt, dass diese State-Management-Technik das natürlichste System für eine komponentenbasierte Architektur ist, aber sie widerspricht den Techniken, über die ich gelesen habe: Dynamisches Spielobjekt-Komponentensystem für Charaktere mit veränderlichem Verhalten Es wird vorgeschlagen, dass alle Komponenten aktiviert / deaktiviert werden sich selbst, indem sie ständig eine Bedingung für die Aktivierung überprüfen.
- Ich denke, dass Aktionen wie "Laufen" oder "Gehen" als Status sinnvoll sind, was mit der hier akzeptierten Antwort nicht übereinstimmt: /gamedev//a/7934
Ich fand das nützlich, aber nicht eindeutig: Wie implementiere ich Verhalten in einer komponentenbasierten Spielarchitektur? Es wird vorgeschlagen, eine separate Komponente zu haben, die nur eine Zustandsmaschine enthält. Dies erfordert jedoch eine Art Kopplung zwischen der Zustandsmaschinenkomponente und nahezu allen anderen Komponenten. Ich verstehe nicht, wie diese Kopplung behandelt werden soll. Dies sind einige Vermutungen:
A. Komponenten sind von der Zustandsmaschine abhängig:
Komponenten erhalten Verweise auf ZustandsmaschinenkomponentengetState()
, die eine Aufzählungskonstante zurückgeben. Komponenten aktualisieren sich regelmäßig und prüfen dies nach Bedarf.B. Die Zustandsmaschine hängt von den Komponenten ab:
Die Zustandsmaschinenkomponente erhält Verweise auf alle Komponenten, die sie überwacht. Es fragt ihregetState()
Methoden ab, um zu sehen, wo sie sich befinden.C. Eine Abstraktion zwischen ihnen
Verwenden Sie einen Event Hub? Befehlsmuster?D. Es werden separate Statusobjekte verwendet, die auf das Statusmuster der Komponenten verweisen
. Es werden separate Statusobjekte erstellt, die eine Reihe von Komponenten aktivieren / deaktivieren. Zustandsmaschine wechselt zwischen Zustandsobjekten.Ich betrachte Komponenten als Implementierungen von Aspekten . Sie tun alles, was intern benötigt wird, um diesen Aspekt zu verwirklichen. Es scheint, als ob Komponenten von selbst funktionieren sollten, ohne auf andere Komponenten angewiesen zu sein. Ich weiß, dass einige Abhängigkeiten erforderlich sind, aber Statusmaschinen scheinen alle meine Komponenten steuern zu wollen.
quelle
In einer früheren Firma, für die ich gearbeitet habe, hatten wir ein komponentenbasiertes System mit staatlicher KI. Wir hatten eine KI-Komponente, die das gesamte Verhalten für dieses Objekt / diese Einheit kontrollierte. Wenn die KI aktiv war, wie z. B. umherwandern, angreifen usw., erhielt sie für jeden Frame ein Update, um die erforderliche Logik auszuführen. Wenn die KI im Leerlauf war oder sich nicht bewegte, wurde die Komponente deaktiviert und nicht für jeden Frame aktualisiert. Die Komponente kann, wenn sie deaktiviert ist, immer noch ereignisbasierte Nachrichten empfangen, so dass sie eine Nachricht für einen Spieler erhält, der ihren Aggro-Radius eingibt, und kann darauf reagieren, indem sie die AI-Komponente reaktiviert, so dass sie rahmenbasierte Aktualisierungen durchführen kann.
Die KI-Komponente verfügt über Unterkomponenten, die je nach Art der durchgeführten Aktionen im Handumdrehen erstellt und zerstört werden können. Wenn es zum Beispiel wanderte, könnte es eine wandernde Unterkomponente erstellen und jeden Frame während des Wanderns aktualisieren. Wenn es während des Wanderns aggro würde, würde es diese Unterkomponente schließen und eine Angriffs-Unterkomponente öffnen. Die AI-Komponente sollte unabhängig von allen anderen Komponenten eines Objekts sein. Wir hatten zum Beispiel eine Eingabekomponente, die einfach nach Bewegungswerten für eine Einheit abfragt. Die Abfrage war etwas, auf das sowohl menschliche als auch KI-Objekte antworten würden. Dies ermöglichte es der KI-Komponente, während des Wanderns einfach Bewegungswerte für sich selbst festzulegen, auf die die Eingabekomponente zugreifen konnte, genau wie eine vom Menschen steuerbare Komponente Werte festlegen würde, auf die die Eingabekomponente zugreifen konnte.
quelle
Component
, der davon abgeleitet istBaseComponent
, eine beliebige Anzahl vonSubComponent
s haben. DieUpdate()
Methode inBaseComponent
würde die Liste der Unterkomponenten prüfen und diese aufrufenUpdate()
.Subcomponents
waren völlig optional, so dass dieBaseComponent
möglicherweise keine haben. Alle Nachrichten, die an eine Komponente gesendet wurden, wurden auch an die Unterkomponenten weitergeleitet.Es ist ein wenig unklar, was Sie unter Komponenten verstehen, da Ihre Begriffe sehr vage sind und keine konkreten Beispiele enthalten. Oft werden Spieleinheiten eher mit Komposition als mit Vererbung erstellt. Auf diese Weise können Sie sie zu etwas machen, das Schaden nehmen kann, indem Sie der Entität eine Integritätskomponente hinzufügen, oder Sie können sie durch Hinzufügen einer Animationskomponente animieren. Man könnte die KI auch in eine solche Komponente einbauen. In Ihrer KI-Komponente gibt es Entscheidungslogik. Wenn Sie Bedenken haben, diese mit einem Großteil des anderen Codes im System zu koppeln, können Sie die Informationen in einer Tafel zusammenfassen, auf die die KI-Logik nur zugreifen darf. Es gibt auch das Problem der Abhängigkeiten von der Ausgabe des AI-Systems. Grundsätzlich kontrolliert Ihre KI eine Entität und diese Kontrolle benötigt eine Schnittstelle. Ein nützliches Konzept ist das eines Controllers oder eines Gamepads. Ihre KI kann eine ähnliche Struktur ausfüllen, die ein Spieler-Gamepad ausfüllen würde (obwohl es einige zusätzliche "Schaltflächen" für bestimmte Fähigkeiten haben könnte). Diese Struktur kann nun an Ihre Animationskomponente übergeben werden, die sie interpretiert und die entsprechenden Animationen für die Wiedergabe auswählt. Verschiedene KI-Unterkomponenten können sogar in verschiedene Felder der Struktur oder in dieselben Felder mit unterschiedlichen Prioritäten schreiben. Zum Beispiel zielen und laufen. Verschiedene KI-Unterkomponenten können sogar in verschiedene Felder der Struktur oder in dieselben Felder mit unterschiedlichen Prioritäten schreiben. Zum Beispiel zielen und laufen. Verschiedene KI-Unterkomponenten können sogar in verschiedene Felder der Struktur oder in dieselben Felder mit unterschiedlichen Prioritäten schreiben. Zum Beispiel zielen und laufen.
quelle