私の質問は:
ゲーム状態オブジェクトのスタックを保持することなく、エンティティシステムでゲーム状態を処理するにはどうすればよいですか?
したがって、エンティティシステムの設計とは、たとえばエンティティが入力イベントに登録する必要がある場合、入力コンポーネントが入力システムを呼び出し、「このエンティティをこの入力に登録する」と言うことです。これはすべて問題ありませんが、これにゲーム状態の概念(たとえば、一時停止画面)を追加すると、エンティティが現在の状態にあり、入力を受け取る必要がある場合に解決することが問題になります。
「これらのゲーム状態にあるときにこのエンティティをこの入力に登録する」と言うように入力コンポーネント/システムを拡張できますが、これにはすべてのエンティティがどの状態で使用されるかを知る必要があり、それは明らかではないかもしれません。また、登録された入力(およびコールバックを使用する他のシステム)ごとにゲームの状態のリストを保持することは、あまり効率的ではありません。
私が持っていた別のアイデアは、ゲーム状態を表すエンティティがあり、無効になっていることをマークし、入力イベントを生成するときに、そのエンティティが無効なゲーム状態エンティティの子孫ではないことを確認することです。コールバックごとに親を解決するのは費用がかかるようです。
別のアイデアは、すべてのシステムに現在の状態に対してキー設定されたデータを保存させることです。そうすることで、入力を生成するときに、ターゲットエンティティは候補にさえなりません。しかし、これは異なる状態のエンティティ間の通信を許可する機能を本当に損ないます(一時停止画面ではそれほど問題ではありませんが、Oblivion / Skyrimでのロック選択を考えてください)。
私が持っていた唯一の他のアイデアは、すべてのコンポーネントが状態変更イベントを処理し、関連するシステムと通信して登録済みのものを無効にし、この状態に戻るときに再び有効にすることです。
2番目(オブジェクトを無効としてマークする)と4番目(各コンポーネントが状態の変更を処理する)は、私のアイデアの中で最高のように見えますが、特に素晴らしいと思うものはありません。
他の誰かがこれを行う方法について他のアイデアを持っていますか?
編集この質問では特に入力について説明しますが、衝突、タイマーイベントなど、エンティティにメッセージ/イベントを送信できるシステムを意味します。