Wie würde man globale Kontextdaten in einem Entitätskomponentensystem speichern?

10

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 AgeSystemalle Entitäten "gealtert" hätte, die eine getsWeakerAsTimePassesKomponente 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?

Awesomanie
quelle
3
Gründe für Abstimmungen sind höflich und nicht nur für das OP, sondern auch für andere Benutzer nützlich.
MichaelHouse
2
Sie haben einen Hammer gebaut und jetzt sieht alles aus wie ein Nagel. Ich gebe Ihnen die Erlaubnis, mehr als nur ECS zum Speichern und Bearbeiten von Daten in Ihrem Programm zu verwenden, da nicht alles ein Nagel ist.
Patrick Hughes

Antworten:

10

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:

  • Singletons
  • "Kontext" -Objekte, die an Komponenten / Systeme übergeben werden, die Verweise auf alle relevanten anderen Systeme enthalten
  • Komponentenfabriken, die Systemhandles an einzelne Komponenten übergeben
  • Komponenten, die Verweise auf Systeme im Stamm einer Objekthierarchie speichern (nur in einigen Oddball-Unity-Spielen)
  • Einzelne "Engine" -Objekte, die an Systeme oder Komponenten übergeben werden, die Verweise auf alle anderen Systeme enthalten
  • String-basierte Ressourcensuchsysteme (mit denen Sie in C ++ so etwas wie handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics")wirklich tun können )
  • Stapel von globalen Daten und freien Funktionen im C-Stil, die auf ihnen ausgeführt werden
  • Räume / Teilräume und zugehöriges Video

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).

Sean Middleditch
quelle
2
Ich bin gespannt, welcher Ihr offensichtlicher Favorit ist.
Asche999
Die Links, die ich bereitgestellt habe, verweisen auf meine Folien und ein Video, in dem ich einen Vortrag zum Thema halte, falls dies ein Hinweis ist. :)
Sean Middleditch
Ah, dein Favorit sind also Leerzeichen / Unterräume . :)
Asche999
Gute Antwort. Ich glaube, ich habe etwas ausgearbeitet, und ich habe das Konzept "Räume / Unterräume" tatsächlich in meinen Spielplan aufgenommen.
Awesomania