エンティティコンポーネントシステムにグローバルコンテキストデータをどのように保存しますか?


10

私の質問はこれです:

グローバルコンテキストデータをどのように保存しますか。エンティティコンポーネントシステムの世界データ情報、現在の世界時間など?

ドワーフフォートレススタイルのオープンエンドの世界シミュレーションゲームをC ++で構築することを考えています。私は楽しみのためにエンティティコンポーネントスタイルのゲームエンジンを構築しました。現在、必要なすべての機能でどのように機能するかを考えています。標準のゲームプレイ(レンダリング、物理、エンティティ固有のコンポーネントデータなど)に加えて、関連するすべてのシステムがアクセスできるグローバルコンテキストデータ(つまり、現在の年などの世界データ)も必要です、地球温暖化が起こっているかどうか、世界のシミュレーションに関連するあらゆる種類の事柄)。私はもともと「ワールド」コンポーネントを作ることを考えていましたが、多くの異なるシステムがこの論理的に「グローバル」なデータにアクセスする必要がある場合、これは無意味で難しいように見えます。

「ワールド」コンポーネントがあるのは理にかなっているでしょうか、それともこのデータを他の方法で保存すべきでしょうか?

また、このデータを単にグローバルにして、それを使用したいすべてのシステムにアクセスできるようにすることも考えました。一般的にはエンティティコンポーネントの原則に違反しているように見えますが、他の理由で混乱しているようですが、実際に機能する可能性があると思いました。

私が考えたもう1つのことは、関連するワールドコンテキストデータをシステム自体に直接埋め込むことです。たとえばAgeSystemgetsWeakerAsTimePassesコンポーネントがあるかどうかに関係なく、すべてのエンティティが「古くなった」場合、おそらくこのシステムは、世界の関連する時間データをメンバーデータとして直接保存し、時間の経過とその量を計算するために使用できます。この3つ目のオプションは、私のお気に入りではありませんでしたが、ブレーンストーミングで思いついたことがあります。

誰かアドバイスできますか?


3
反対投票の根拠は礼儀正しく、OPだけでなく他のユーザーにも役立ちます。
MichaelHouse

2
ハンマーを作成しましたが、すべてが釘のように見えます。すべてが釘であるとは限らないため、プログラムでデータを保持および操作するためにECS以外のものを使用する許可を与えます。
Patrick Hughes

回答:


10

機能する方法は、機能する方法です。面白そうに聞こえますが、実際には、ゲームはアーキテクチャよりも1000倍重要です。あなたが好きなアプローチを選び、使いやすいと思います。

実際の出荷ゲームで見たもの(特にECSではなく、コンポーネントベースの設計を使用しています。純粋なECSを「実際に」見たことはありませんが、多くのコンポーネント設計にはECSのような要素が含まれています)。

  • シングルトン
  • 関連する他のすべてのシステムへの参照を含むコンポーネント/システムに渡される「コンテキスト」オブジェクト
  • システムハンドルを個々のコンポーネントに渡すコンポーネントファクトリ
  • システムへの参照をオブジェクト階層のルートに格納するコンポーネント(一部の奇妙なUnityゲームのみ)
  • 他のすべてのシステムへの参照を保持するシステムまたはコンポーネントに渡される単一の「エンジン」オブジェクト
  • 文字列ベースのリソースルックアップシステム(C ++ではhandle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics")、そう、本当にそうすることができます)
  • グローバルデータの山とそれらを操作するCスタイルの無料関数
  • スペース/サブスペース付随するビデオ

それらはすべて機能します。私はいくつかのアプローチに不満があり、明らかなお気に入りがありますが、それらはすべてAAAゲームの出荷に使用されています。場合によっては、単一のプロジェクトで複数のアプローチを使用することもあります(40-100以上のエンジニアチームは、あえて無計画な重複コードを作成する傾向があります)。


2
私はあなたの明らかなお気に入りがどれなのか知りたいです。
ashes999 2013

私が提供したリンクは、私のスライドと、そのトピックについて講演をしている私のビデオです(ヒントがある場合)。:)
Sean Middleditch 2013

ああ、それであなたのお気に入りはスペース/サブスペースです。:)
ashes999 2013

すばらしい答えです。私は何かうまくいったと思います、そして私は実際に先に進んでそして私の「ゲームプラン」に「スペース/サブスペース」概念を組み込みました。
Awesomania 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.