私はゲーム開発(プログラミングではなく)に非常に慣れていないので、世界間の通信を処理するための最良の方法を理解しようとしています。私が言っているのはこれです:
私はエンティティコンポーネントシステム(ECS)と、人々がさまざまなワールド/スペース(http://gamedevelopment.tutsplus.com/tutorials/spaces-useful-game-object-containers--gamedev-14091)の使用をどのように提案するかについて読んでいますゲームのサブセクション。たとえば、HUD、インベントリ、または戦闘/移動は、それぞれ異なるワールド/スペースを取得します(それらは異なるグラフィックスと基礎となるロジックを持っているためです)。
しかし、たとえば戦闘中など、別のスペース/ワールドによってヘルスが処理される場合、インベントリまたはHUDがプレーヤーのヘルスをどのように知っているのかと思いました。
これは、ゲームの進行状況にも適用されます。たとえば、NPCとのダイアログ(ダイアログはポップアップ画面であるため別のスペースになります)ですが、ダイアログで行われた選択(または状態)を他のスペース/ワールドにどのように伝えますか。 。または基本的に、さまざまなスペース/世界でのゲームの進行に影響を与える他のタイプのイベント(健康、マナ、クエスト、ダイアログ、戦闘、インベントリ、hudなど)
この種の設計をどのように処理するでしょうか?このような情報をすべて保持する(実装の)シングルトンオブジェクトが必要ですか?それは奇妙なことです。それは、components
2回物事をしているように感じる(プログラミングのメインDRYに反対する)このシングルトンオブジェクトに各変更を伝える必要があるからです...
私はここでデザインの点で途方に暮れています。
---編集---
だから私はコメントで提案された他のいくつかの投稿を読んで、可能性についての一般的な考えを得ましたが、それらのそれぞれには、それらを正しくないようにする1つの大きな欠点があるようです。これらの欠点を解決する詳細を監督している可能性が非常に高いため、自由に修正してください。概要と、いくつかの質問に対する回答を示します。
スペース間でデータを「共有」する3つの主要なオプションが表示されます。ほとんどの投稿はシステム間でのデータ共有に関するものですが、システム間でのデータ共有にも同じことが当てはまると思います。
1.クエリ
例:HUDワールドがプレーヤーの現在のヘルスを知る必要がある場合、HUDワールドは別のワールドを照会して現在のヘルスを要求できます。
欠点:世界はお互いを知る必要があります。これは依存関係の大きな問題であり、デカップリングに反対しています。
2:ダイレクトメッセージング(同期および非同期)
例:戦闘中にプレーヤーのヘルスが変更された場合、この変更について知る必要がある他の世界にメッセージ(同期と非同期、必要なものは何でも)を送信できます。
欠点:それでもデカップリングの問題:世界はお互いについて知る必要があります。
3:間接メッセージング(同期および非同期) <-最適なオプション
例:戦闘中にプレーヤーのヘルスが変化した場合、プレーヤーはメッセージ(同期と非同期、必要なものは何でも)を一般的なメッセージハブに送信できます。この変更について知る必要がある他の世界/システムは、特定のメッセージチャネルにサブスクライブされ、メッセージを読み取ります。
利点:完全に分離され、管理と拡張が容易です。
欠点/不明確:メッセージチャネルは、メッセージを削除する必要があることをいつ知っていますか?または、サブスクライブしているシステムがメッセージを(それ自体のみ)既読としてマークし、新しいメッセージを待つ->しばらくするとメッセージボックスが巨大になる。ワールド/システムはどのように順序を処理しますか?たとえば、フレーム中:HUDがすでにヘルスメッセージをポーリングし、その後ヘルスが変化した場合、次のフレームでHUDが更新されます。一部のアプリケーションでは、これは正しい方法ではない場合があります。
Q:1つのゲームオブジェクトが複数のスペースに存在できます
私は組み込みスペース(ワールドと呼ばれます)に付属しているArtemis ECSフレームワークを使用しています。各エンティティ(およびそれとともにコンポーネントの形式のデータ)はワールド上に作成されるため、ワールド間で共有することはできません。