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
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
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 AND
Operation ü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:
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.
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 long
Schlü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.)