Commission: Mad Scientist by Culpeo-Fox on DeviantArt
In diesem Artikel werde ich das ECS-Muster und meine Implementierung im Flame Steel Engine Game Toolkit grob beschreiben. Das Entity Component System-Muster wird in Spielen verwendet, einschließlich. auf der Unity-Engine. Jedes Objekt im Spiel ist eine Essenz, die mit Komponenten gefüllt ist. Warum ist das notwendig, wenn es OOP gibt?
Dann können Sie die Eigenschaften, das Verhalten und die Anzeige von Objekten direkt während des Spiels ändern. Solche Dinge gibt es in realen Anwendungen nicht; die Dynamik sich ändernder Parameter, Objekteigenschaften, Anzeige und Sound ist charakteristischer für Spiele als für Buchhaltungssoftware.
An Bananen sind wir nicht vorbeigegangen
Nehmen wir an, wir haben eine Bananenklasse in unserem Spiel. Und der Spieleentwickler wollte, dass Bananen als Waffen verwendet werden. Nehmen wir an, dass Bananen in der aktuellen Architektur nichts mit Waffen zu tun haben. Eine Banane zur Waffe machen? Alle Gegenstände zu Waffen machen?
ECS bietet eine Lösung für dieses dringende Problem – Alle Objekte im Spiel müssen aus Komponenten bestehen. Früher war Banana die Banana-Klasse, jetzt machen wir sie und alle anderen Objekte zur Entity-Klasse und fügen ihnen Komponenten hinzu. Nehmen wir an, eine Banane besteht nun aus folgenden Komponenten:
- Positionskomponente (Koordinaten in der Spielwelt – x, y, z)
- Rotationskomponente (x-, y-, z-Koordinaten)
- Kalorienanteil einer Banane (die Hauptfigur sollte nicht zu dick werden)
- Bananen-Bildkomponente
Jetzt fügen wir eine neue Komponente für alle Bananen hinzu, nämlich eine Flagge, die besagt, dass sie als Waffe verwendet werden kann – Waffenkomponente. Wenn das Spielsystem nun erkennt, dass sich ein Spieler einer Banane genähert hat, prüft es, ob eine Waffenkomponente auf der Banane vorhanden ist, und wenn dies der Fall ist, bewaffnet es den Spieler mit einer Banane.
In meinem Spiel Flame Steel Call Of The Death Mask wird durchgehend das ECS-Muster verwendet. Objekte bestehen aus Komponenten, und Komponenten selbst können Komponenten enthalten. Im Allgemeinen ist die Aufteilung des Objekts < – > Die Komponente fehlt in meiner Implementierung, aber das ist sogar ein Plus.

Die Schrotflinte in diesem Screenshot ist eine Komponente des Spielers, und gleichzeitig hängt die zweite Schrotflinte einfach als gewöhnliches Objekt auf der Spielkarte.
In diesem Screenshot laufen zwei Systeme: – Szenen-Renderer und Schnittstellen-Renderer. Der Szenen-Renderer arbeitet mit der Schrotflinten-Bildkomponente auf der Karte, der Schnittstellen-Renderer arbeitet mit der Schrotflinten-Bildkomponente in den Händen des Spielers.
Verwandte Links:
https://habrahabr.ru/post/197920/
https://www.youtube.com/watch?v=NTWSeQtHZ9M