Meine Frage lautet:
Wie würde man globale Kontextdaten speichern, dh. Weltdateninformationen, aktuelle Weltzeit usw. in einem Entitätskomponentensystem?
Ich denke daran, ein offenes Weltsimulationsspiel im Stil einer Zwergenfestung in C ++ zu entwickeln. Ich habe nur zum Spaß eine Spiel-Engine im Stil von Entity-Komponenten erstellt und versuche derzeit herauszufinden, wie ich mit allen gewünschten Funktionen arbeiten werde. Zusätzlich zum Standardspiel (Rendering, Physik, entitätsspezifische Komponentendaten usw.) möchte ich auch einige globale Kontextdaten haben, auf die alle relevanten Systeme Zugriff haben (dh die Weltdaten wie das aktuelle Jahr) , ob es zu einer globalen Erwärmung kommt, alles, was für die Simulation einer Welt relevant wäre). Ich hatte ursprünglich daran gedacht, eine "Welt" -Komponente zu erstellen, aber dies scheint sinnlos und schwierig zu sein, wenn viele verschiedene Systeme Zugriff auf diese logisch "globalen" Daten benötigen.
Wäre es sinnvoll, eine "Welt" -Komponente zu haben, oder sollte ich diese Daten auf andere Weise speichern?
Ich hatte auch darüber nachgedacht, diese Daten einfach global zu machen und so Zugriff auf alle Systeme zu gewähren, die sie verwenden möchten. Es scheint eine Verletzung der Prinzipien von Entitätskomponenten im Allgemeinen zu sein und aus anderen Gründen vielleicht chaotisch, aber ich dachte, dass es wirklich funktionieren könnte.
Das andere, woran ich gedacht hatte, wäre, relevante Weltkontextdaten direkt in die Systeme selbst einzubetten. Wenn ich beispielsweise AgeSystem
alle Entitäten "gealtert" hätte, die eine getsWeakerAsTimePasses
Komponente oder so weiter haben, könnte dieses System möglicherweise relevante Zeitdaten für die Welt direkt als Mitgliedsdaten speichern, die es zur Berechnung des Zeitablaufs und der Höhe verwenden würde Menschen altern und schwächen usw. Diese dritte Option war meine am wenigsten bevorzugte, aber etwas, das mir beim Brainstorming eingefallen war.
Kann mir jemand raten?
quelle
Antworten:
Jeder Weg, der funktioniert, ist ein Weg, der funktioniert. Das klingt abfällig, aber Ihr Spiel ist 1000x wichtiger als Ihre Architektur. Wählen Sie einen beliebigen Ansatz und finden Sie ihn einfach zu bedienen.
Zu denen, die ich in echten Versandspielen gesehen habe (mit komponentenbasiertem Design, nicht speziell mit ECS; ich habe noch nie reines ECS "in the wild" gesehen, obwohl viele Komponentendesigns ECS-ähnliche Elemente enthalten), gehören:
handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics")
wirklich tun können )Sie alle arbeiten. Ich habe einige Ansätze und einen offensichtlichen Favoriten im Griff, aber sie wurden alle verwendet, um AAA-Spiele zu versenden. Manchmal gibt es mehrere Ansätze in einem einzigen Projekt (mehr als 40-100 Ingenieurteams neigen dazu, zufälligen doppelten Code zu erstellen, leider).
quelle