Beim Entwerfen eines Entity-Component-Systems für meine Engine bin ich auf einen kleinen Haken beim Speichern und Abrufen eines bestimmten Komponententyps gestoßen.
Lassen Sie mich zunächst einige Begriffe festlegen, die ich in dieser Frage verwenden werde:
- Ich nenne " Komponente " eine Datenstruktur, die relevante Daten für ein bestimmtes System speichert.
- Ich nenne " System " eine Ansammlung von Methoden und Datenstrukturen, die Komponenten verwenden, um den Spielstatus / die Spielschnittstelle mit dem Benutzer zu aktualisieren.
- Eine " Entität " ist im Grunde nur eine ID, mit der bestimmte Komponenten abgerufen und ihre Daten in der Spielelogik geändert werden.
Jedes System besitzt ein (ID-zugeordnetes) Array seines Komponententyps (z. B. Physik-> Physikkomponente, AI-> AIComponent, Rendering-> RenderingComponent), sodass es effizient über Daten iterieren kann.
Nicht alle Komponenten gehören jedoch speziell einem System. Eine Transformationskomponente speichert beispielsweise die Position, Drehung und Skalierung eines Objekts. Es ist einer der wichtigsten Teile einer Entität (Unity macht es sogar obligatorisch), da es von vielen Systemen verwendet wird, z. B. Physik, KI, Rendering usw.
Dies ist so ziemlich das Problem, mit dem ich konfrontiert bin. Wie kann ich vorgehen, da Transform von vielen anderen Systemen verwendet wird, um eines für jede Komponente zu finden? Eine mögliche Lösung besteht darin, dass jede Komponente ihre eigene Entitäts-ID speichert. Es wäre einfach, eine solche Komponente abzurufen, aber es wäre nicht so effizient, und es würde auch gegen das Konzept einer Komponente als isoliertes und unabhängiges Datenbündel verstoßen, das keine andere kennt.
Gibt es einen geeigneten Weg, um dieses Problem zu lösen? Sollte Transform überhaupt eine Komponente sein?