Systeme sollten ein Schlüsselwertpaar von Entity to Component in einer Art Map, Dictionary Object oder Associative Array speichern (abhängig von der verwendeten Sprache). Außerdem würde ich mir beim Erstellen Ihres Entitätsobjekts keine Gedanken darüber machen, es in einem Manager zu speichern, es sei denn, Sie müssen es von einem der Systeme abmelden können. Eine Entität ist eine Zusammenstellung von Komponenten, sollte jedoch keine Komponentenaktualisierungen verarbeiten. Das sollte von den Systemen übernommen werden. Behandeln Sie Ihre Entität stattdessen als einen Schlüssel, der allen in den Systemen enthaltenen Komponenten zugeordnet ist, sowie als einen Kommunikationsknoten, über den diese Komponenten miteinander kommunizieren können.
Der große Teil der Entity-Component-System-Modelle besteht darin, dass Sie die Möglichkeit implementieren können, ganz einfach Nachrichten von einer Komponente an die übrigen Komponenten einer Entität zu übergeben. Auf diese Weise kann eine Komponente mit einer anderen Komponente kommunizieren, ohne zu wissen, wer diese Komponente ist oder wie mit der zu ändernden Komponente umgegangen wird. Stattdessen wird eine Nachricht übergeben und die Komponente kann sich selbst ändern (falls vorhanden).
Zum Beispiel würde ein Positionssystem nicht viel Code enthalten, sondern nur Entitätsobjekte verfolgen, die ihren Positionskomponenten zugeordnet sind. Wenn sich eine Position ändert, kann eine Nachricht an die betreffende Entität gesendet werden, die wiederum an alle Komponenten dieser Entität weitergeleitet wird. Eine Position ändert sich aus welchem Grund auch immer? Das Positionssystem sendet der Entität eine Nachricht, die besagt, dass sich die Position geändert hat, und dass die Bildwiedergabekomponente dieser Entität diese Nachricht abruft und aktualisiert, wo sie sich als Nächstes selbst zeichnet.
Umgekehrt muss ein Physiksystem wissen, was alle seine Objekte tun. Es muss in der Lage sein, alle Weltobjekte zu sehen, um Kollisionen zu testen. Wenn eine Kollision auftritt, wird die Richtungskomponente der Entität aktualisiert, indem eine Art "Richtungsänderungsnachricht" an die Entität gesendet wird, anstatt direkt auf die Entitätskomponente zu verweisen. Dies entkoppelt den Manager von der Notwendigkeit, mithilfe einer Nachricht die Richtung ändern zu müssen, anstatt sich darauf zu verlassen, dass eine bestimmte Komponente vorhanden ist (die möglicherweise überhaupt nicht vorhanden ist). In diesem Fall stößt die Nachricht nur auf taube Ohren, anstatt auf einen Fehler auftreten, weil ein erwartetes Objekt nicht vorhanden war).
Sie werden einen enormen Vorteil davon bemerken, da Sie erwähnt haben, dass Sie eine Netzwerkschnittstelle haben. Eine Netzwerkkomponente würde alle eingehenden Nachrichten abhören, über die alle anderen Bescheid wissen sollten. Es liebt den Klatsch. Wenn das Netzwerksystem aktualisiert wird, senden die Netzwerkkomponenten diese Nachrichten an andere Netzwerksysteme auf anderen Clientcomputern, die sie dann erneut an alle anderen Komponenten senden, um die Playerpositionen usw. zu aktualisieren. Möglicherweise ist eine spezielle Logik erforderlich, damit nur bestimmte Entitäten dies können Nachrichten über das Netzwerk senden, aber das ist das Schöne am System. Sie können diese Logik einfach steuern lassen, indem Sie die richtigen Dinge dafür registrieren.
Zusamenfassend:
Entität ist eine Zusammensetzung von Komponenten, die Nachrichten empfangen können. Die Entität kann Nachrichten empfangen und diese an alle Komponenten delegieren, um sie zu aktualisieren. (Position geändert Nachricht, Geschwindigkeitsänderung Richtung, etc.) Es ist wie eine zentrale Mailbox, die alle Komponenten voneinander hören können, anstatt direkt miteinander zu sprechen.
Die Komponente ist ein kleiner Teil einer Entität, in dem ein bestimmter Status der Entität gespeichert ist. Diese können bestimmte Nachrichten analysieren und andere Nachrichten wegwerfen. Beispielsweise würde sich eine "Richtungskomponente" nur um "Richtungsänderungsnachrichten" kümmern, nicht aber um "Positionsänderungsnachrichten". Komponenten aktualisieren ihren eigenen Status basierend auf Nachrichten und aktualisieren dann den Status anderer Komponenten, indem sie Nachrichten von ihrem System senden.
Das System verwaltet alle Komponenten eines bestimmten Typs und ist dafür verantwortlich, die Komponenten in jedem Frame zu aktualisieren und Nachrichten von den von ihnen verwalteten Komponenten an die Entitäten zu senden, zu denen die Komponenten gehören
Systeme könnten in der Lage sein, alle ihre Komponenten parallel zu aktualisieren und alle Nachrichten zu speichern, wenn sie gehen. Wenn die Ausführung der Aktualisierungsmethoden aller Systeme abgeschlossen ist, bitten Sie jedes System, seine Nachrichten in einer bestimmten Reihenfolge zu senden. Kontrollen zuerst möglich, gefolgt von Physik, gefolgt von Richtung, Position, Rendering usw. Es ist wichtig, in welcher Reihenfolge sie gesendet werden, da ein Richtungswechsel in der Physik eine kontrollbasierte Richtungsänderung immer ausgleichen sollte.
Hoffe das hilft. Es ist eine Hölle von Design Patterns, aber es ist lächerlich mächtig, wenn es richtig gemacht wird.