Entity
Component
System
Spielobjekte komponieren statt vererben: das Architekturmuster hinter Bevy, Unity DOTS & Co.
Entity
Nur eine ID. Sonst nichts.
// player == 7
Component
Nur Daten. Kein Verhalten.
System
Nur Logik. Läuft jeden Frame / Tick.
Die Vererbungsfalle
Es fängt meist klein und einfach an: Enemy erbt von GameObject.
Dann kommt ein fliegender Gegner. Dann ein schwimmender.
Und dann will dein Spiel einen Gegner, der fliegt und schwimmt. Wovon erbt der jetzt?
Doppelt erben geht oft nicht.
Also:
Code kopieren, wird schon schief gehn.
Drei Bausteine, klare Rollen
Entity
Nur eine ID. Kein Code, keine Daten. Eine leere "Steckleiste", an die alles drangesteckt wird.
entity #7Component
Reine Daten. Ein kleines Datenpaket pro Fähigkeit oder Eigenschaft.
System
Die Logik. Läuft jeden Frame/Tick über alle Entities, die die passenden Components haben.
⚙ MovementSystemMerksatz: Entity = Wer · Component = Was · System = Wie
Ein System ist eine Schleife mit Filter
for entity in query(Position, Velocity):
entity.Position.x += entity.Velocity.dx * dt
entity.Position.y += entity.Velocity.dy * dt
query(...)
liefert alle Entities, die beide Components haben.
Ob das ein Spieler, ein Pfeil oder ein Slime ist? Dem System völlig egal. Es kennt nur Daten.
if (obj is Player), keine
Interfaces. Die Component-Kombination ist der Filter.
Deine Spielwelt ist eine Tabelle
| Entity | Position | Velocity | Sprite | Health | Input |
|---|---|---|---|---|---|
| #1 Spieler | x, y | dx, dy | hero.png | 100 HP | WASD |
| #2 Slime | x, y | dx, dy | slime.png | 20 HP | — |
| #3 Pfeil | x, y | dx, dy | arrow.png | — | — |
| #4 Kiste | x, y | — | crate.png | — | — |
⚙ MovementSystem query(Position, Velocity) → matcht #1, #2, #3 — die Kiste bleibt stehen.
Bau dir eine Entity
Klick Components an und ab. Welche Systeme springen an?
entity #7 · 0 Components
Verhalten anstecken wie einen Baustein
Dein Feuerpfeil trifft einen Slime? Füge einfach eine Burning {3s}-Component an.
Vorher
FireSystem: ignoriert ihn
Treffer! Component angesteckt
FireSystem: läuft ✓ Abhängen wenn Timer abgelaufen.
if (target is Enemy &&
target.canBurn && ...) — die Systeme reagieren von selbst auf das, was dransteckt.
Warum ECS schnell sein kann
Klassische Objekte im Speicher
Alles kreuz und quer, die CPU springt ständig hin und her.
ECS: Component-Arrays
Gleiche Daten liegen nebeneinander, die CPU kann einfach durchiterieren.
CPUs laden Speicher in Blöcken (Cache). Liegen alle Positionen hintereinander, kommt der nächste Wert quasi gratis mit.
Genau so iterieren Systeme: ein Component-Typ nach dem anderen, in einem Rutsch.
Was ECS einfach mitbringt
- Komposition statt HierarchieNeue Objektarten sind nur neue Kombination von Components. Kein wilder Klassenbaum.
- Schnell bei vielen ObjektenCache-freundliche Daten & Systeme, die sich gut parallelisieren lassen.
- Flexibel zur LaufzeitVerhalten an- und abstecken: Burning, Frozen, Stunned. Das ganze ohne eine Zeile am Gegner-Code zu ändern.
- Systeme sind unabhängigKlein, fokussiert, einzeln testbar. Systeme lassen sich an- und ausschalten oder komplett entnehmen.
- Savegames fast gratisComponents sind reine Daten. Einfach die Tabelle wegschreiben und wieder laden.
Wo es wehtut
- Umdenken nötigKein „mein Player-Objekt macht X" mehr. Man muss in Daten und Queries denken. Das fühlt sich erst mal ungewöhnlich an.
- Debugging ist verteiltWarum bewegt sich der Gegner komisch? Die Antwort steckt im Zusammenspiel von fünf Systemen, nicht in einer Klasse.
- Beziehungen sind fummeligInventar, Parent-Child, „Pfeil gehört zu Bogenschütze" lässt sich oft nur über Workarounds abbilden.
- Reihenfolge zähltInput vor Movement vor Kollision vor Rendern? Falsche System-Reihenfolge = subtile, fiese Bugs.
- Viel Gerüst für wenig Spiel„Tür öffnet sich bei Knopfdruck" braucht plötzlich Components, ein System und eine Query. Für Kleines: Overkill.
Brauchst du ECS?
Gute Gründe dafür
- Bullet Hell, Sandbox, Simulation — tausende gleichartige Dinge gleichzeitig
- Objekte, die ständig Fähigkeiten wechseln (Buffs, Status-Effekte, Crafting)
- Du willst Architektur lernen und hast Spaß am Muster selbst
Eher nicht
- Point&Click, Puzzle, Visual Novel — wenige, individuelle Objekte
- Dein erstes Projekt oder ein Game Jam mit Zeitdruck
- UI-lastige Spiele und Tools
Womit du starten kannst
Bevy Rust
Ganze Engine um ein ECS herum gebaut. Moderne API, sehr aktive Community.
EnTT C++
Header-only Bibliothek, blitzschnell. Läuft u. a. in Minecraft (Bedrock).
Flecs C / C++
Sehr gute Doku und Erklärtexte, top zum Lernen der Konzepte.
Unity DOTS C#
Unitys offizielles ECS-Paket (Entities), für performancekritische Teile deines Spiels.
Kurz zusammengefasst
Entity = ID, Component = Daten, System = Logik.Die Spielwelt ist eine Tabelle, Systeme sind Schleifen mit Filter darüber.
Komposition schlägt Vererbung.Verhalten wird komponiert, nicht geerbt. Der fliegend-schwimmende Gegner ist einfach: Flying + Swimming.
ECS glänzt bei vielen Objekten.Für kleine Projekte reicht Komposition à la Unity/Godot völlig.