Welche Rolle spielen "Systeme" in einer komponentenbasierten Entitätsarchitektur?

177

Ich habe viel über Entitätskomponenten und -systeme gelesen und dachte, dass die Idee, dass eine Entität nur eine ID ist, ziemlich interessant ist.

Allerdings weiß ich nicht, wie das mit dem Komponentenaspekt oder dem Systemaspekt vollständig funktioniert. Eine Komponente ist nur ein Datenobjekt, das von einem relevanten System verwaltet wird. Ein Kollisionssystem verwendet einige BoundsComponent zusammen mit einer räumlichen Datenstruktur, um festzustellen, ob Kollisionen aufgetreten sind.

Bisher alles in Ordnung, aber was ist, wenn mehrere Systeme auf dieselbe Komponente zugreifen müssen? Wo sollen die Daten leben? Ein Eingabesystem könnte eine Entität BoundsComponent modifizieren, aber die Physiksysteme benötigen Zugriff auf dieselbe Komponente wie einige Rendering-Systeme.

Wie werden Entitäten aufgebaut? Einer der Vorteile, über die ich so viel gelesen habe, ist die Flexibilität beim Entity-Aufbau. Sind Systeme an eine Komponente gebunden? Wenn ich eine neue Komponente einführen möchte, muss ich dann auch ein neues System einführen oder ein vorhandenes modifizieren?

Eine andere Sache, die ich oft gelesen habe, ist, dass der 'Typ' einer Entität von den Komponenten abgeleitet wird, die sie hat. Wenn meine Entität nur eine ID ist, wie kann ich dann wissen, dass meine Roboter-Entität von einem System verschoben oder gerendert und somit modifiziert werden muss?

Entschuldigung für den langen Beitrag (oder zumindest scheint es so von meinem Telefonbildschirm)!

bio595
quelle

Antworten:

336

Es gibt eine Vielzahl von Möglichkeiten, Entitätskomponentensysteme darzustellen und zu implementieren. Hier wird jedoch eine Möglichkeit erläutert. Denken Sie daran, dass es keine konkrete Definition von Entitäts- / Komponenten- / Systemarchitekturen gibt. Dies ist also nur eine Implementierung.

Ich werde eine Analogie für Entity / Component / System-Architekturen einführen, die hilfreich sein könnte. Stellen wir uns eine Entität wie einen Schlüssel vor.

Die Entität

Objektschlüssel

Schlüssel haben auch Zähne (dunkelblau). Die Zähne unseres Entitätsschlüssels sind die Komponenten, aus denen er besteht. Sie können Entitäten anhand ihrer ID unterscheiden, auch wenn sie die gleichen Zähne haben. Worin passen die Schlüssel? Schlösser. Schlösser sind unsere Systeme. Zum Beispiel ein Bewegungssystem.

Das System

Bewegungssperre

Das Schloss funktioniert nur, wenn unser Schlüssel Zähne für Position und Geschwindigkeit hat. Dieses System verarbeitet nur Entitäten, die eine Position und eine Geschwindigkeit haben. Es gibt mehrere Möglichkeiten, um festzulegen, wie diese Systeme erkennen, welche Entitäten verarbeitet werden sollen. Eine Möglichkeit ist jedoch, a zu verwenden long. Jedes Bit ist für einen Komponententyp reserviert. In unserem Beispiel nehmen wir einen 4-Bit-Typ anstelle eines 64-Bit-Typs an. Unsere Beispielentität verfügt über alle verfügbaren Komponenten. Also wäre es der Schlüssel 1111. Dann sucht das System nach einer Entität mit a 11--. (Die -Repräsentanten kümmern sich nicht darum, weil Bewegung sich nicht darum kümmert, ob es ein Sprite oder eine Gesundheit gibt). Es kann eine Entität mit einer einfachen ANDOperation überprüfen . Unsere Entität passt also zu if ((1111 & 1100) == 1100). Wenn ich Sie dort verloren habe, lesen Sie mehr über bitweise Operationen .

Wie Sie sehen, haben Systeme Zugriff auf externe Ressourcen. Sie können auf Uhrzeit, Grafik, Ton usw. zugreifen. Sie sind einfach kleine Prozessoren, die jeweils einen Schlüssel nehmen und Daten verarbeiten. Sie sehen, dass das Bewegungssystem die Geschwindigkeit, die Deltazeit und die Position erfasst. führt dann einige Berechnungen durch und speichert das Ergebnis wieder in Position.

Die Entitätsschlüssel sind sehr einfach zu generieren. Sie können sie nach Belieben hinzufügen oder entfernen. Die Entität kümmert sich nicht darum, es ist nur eine Möglichkeit, die Komponenten zu gruppieren und zu halten. Die Komponenten sind nicht voneinander abhängig. Die Komponenten können am ehesten miteinander interagieren, wenn sie von einem System bearbeitet werden und Daten von einem zum Aktualisieren eines anderen verwendet werden, wie in unserem Bewegungsbeispiel.

Schauen wir uns ein anderes System an, um die Idee zu verfestigen:

Zeichnungssystem sperren

Dies ist unser Zeichensystem. Es wird nach passenden Komponenten gesucht 1-1-. Diese Entität stimmt überein, weil: ((1111 & 1010) == 1010)Außerdem können Sie sehen, dass dieses System Informationen auf dem Bildschirm ausgibt, indem Sie das Entitäts-Sprite an seiner Position zeichnen.

OK, noch eine. Schauen wir uns eine andere Entität an und sehen wir, wie sie bisher in unser Beispiel passt.

Nicht beweglicher Entitätsschlüssel

Wie Sie sehen, sind mit dieser Entität weniger Komponenten verbunden. Wenn man sich die Komponenten anschaut, sieht es so aus, als ob es sich um einen statischen Gegenstand wie einen Stein handeln könnte. Es hat nur eine Position und ein Sprite. Es wird sich nicht bewegen und es wird nicht von gesundheitlichen Veränderungen betroffen sein. Diese Entität würde einen Schlüssel von 1010 erzeugen. Welche Systeme arbeiten also mit dieser Entität? Lass uns das Prüfen:

Gegen unser Bewegungssystem: ((1010 & 1100) != 1100)Nein. Es sieht so aus, als würde das Bewegungssystem diese Entität nicht interessieren, weil es nicht die erforderlichen Komponenten hat.

Gegen unser Zeichensystem: ((1010 & 1010) == 1010)Hey, das ist ein Match. Diese Entität wird vom Zeichnungssystem bearbeitet. Das Zeichnungssystem zeichnet das Sprite an der festgelegten Position.


Hoffentlich können Sie sehen, wie einfach es wäre, jetzt ein weiteres System hinzuzufügen, das unsere Komponenten aufnimmt und auf ihnen arbeitet. Lassen Sie mich sicherstellen, dass ich Ihre Fragen beantwortet habe:

Was ist, wenn mehrere Systeme Zugriff auf dieselbe Komponente benötigen? Wo sollen die Daten leben?

Typischerweise arbeiten Systeme nacheinander. Sie verarbeiten alle Entitäten, die ihren Anforderungen entsprechen, und dann macht das nächste System dasselbe und so weiter. Die Daten leben mit der Entität. Es sollte nichts im System gespeichert sein, es ist nur ein Schloss, das gedreht wird. Der Schlüssel ist der Ort, an dem die Informationen verbleiben und sich von Schloss zu Schloss bewegen.

Wie sind Entitäten aufgebaut? Sind Systeme an eine Komponente gebunden? Wenn ich eine neue Komponente einführen möchte, muss ich dann auch ein neues System einführen oder ein vorhandenes modifizieren?

Entitäten sind nur Taschen mit Komponenten. Sie haben eine eindeutige ID und eine Liste der Komponenten. Systeme sind nur in der oben beschriebenen Weise an Komponenten gebunden. Sie können Komponenten ohne Systeme haben, die auf ihnen arbeiten, aber das ist ziemlich sinnlos. Ebenso können Sie Systeme haben, die nach Komponenten suchen, die keine Entitäten haben. Das ist weniger sinnlos, da sie möglicherweise nur darauf warten, dass eine Entität erstellt wird, die mit ihrer Sperre übereinstimmt. Wenn Sie also eine neue Komponente einführen, möchten Sie ein System erstellen, das diese Komponente verwendet. Andernfalls fügen Sie Ihrem Schlüssel nur Zähne für ein nicht vorhandenes Schloss hinzu.

Wenn meine Entität nur eine ID ist, wie kann ich dann wissen, dass meine Roboter-Entität von einem System verschoben oder gerendert und somit modifiziert werden muss?

Ich denke, ich beantworte dies mit der Idee eines longSchlüssels, der die in einer Entität enthaltenen Komponenten definiert. Sie wissen, weil der Schlüssel zum Schloss passt.

Puh! Das war ein langer Beitrag! (Oder zumindest scheint es so von meinem großen Monitor.)

MichaelHouse
quelle
23
Diese Schlüsselanalogie ist wirklich hilfreich, um die ganze Idee jetzt zu verstehen. Brilliante Idee! Lol bei Ihrem letzten Absatz :)
bio595
16
+1 Für die beste und beste Erklärung des Entity-Component-Systems, das ich je gesehen habe. :O!
Knight666
7
-1 von mir - nicht weil dies ein schlechter Ansatz ist, sondern weil er als DER Ansatz dargestellt wird. Es gibt jedoch viele Systeme, in denen Komponenten und Dienste nicht voneinander getrennt sind (z. B. in Unity), und Systeme können auf einfachere Weise erkennen, welche Entitäten verarbeitet werden sollen (fügen Sie sie einfach hinzu, wenn die Entität erstellt wird).
Kylotan
37
@Kylotan Ich sage: " Es gibt mehrere Möglichkeiten, umlong festzulegen , wie diese Systeme erkennen, welche Entitäten verarbeitet werden sollen, aber eine Möglichkeit ist die Verwendung von a . " Außerdem behalte ich mir normalerweise das Abwärtsstimmen für Antworten vor, die nicht nützlich sind (als Schwebetext) sagt). Ich denke, Sie würden viel Zeit damit verbringen, Abstimmungen durchzuführen, wenn Sie alle Antworten beantworten würden, die nicht 100% der behandelten Themen abdecken.
MichaelHouse