我的问题是:
如何在我的实体系统中处理游戏状态,而又不保留周围的游戏状态对象堆栈?
因此,我的实体系统的设计意味着,例如,当某个实体需要注册输入事件时,输入组件将调用输入系统,并说“为此输入注册此实体”。一切都很好,但是,如果您将游戏状态的概念(例如暂停屏幕)加入其中,那么确定实体是否处于当前状态并应接收输入就变得很困难。
我可以扩充输入组件/系统,使其说“在处于这些游戏状态时为此输入注册此实体”,但这要求每个实体都知道将在其中使用哪个状态,这可能并不明显。同样,在每个注册的输入(以及其他使用回调的系统)周围保留游戏状态列表听起来并不太有效。
我有另一个想法,因为将有一个代表游戏状态的实体,将其标记为已禁用,然后在生成输入事件时检查该实体不是已禁用游戏状态实体的后代。为每个回调计算父级似乎很昂贵。
另一个想法是让所有系统针对当前状态存储其数据密钥,这样,在生成输入时,目标实体甚至都不是候选对象。但是,这确实损害了允许处于不同状态的实体之间进行通信的能力(对于暂停屏幕而言,这并不是什么大问题,但请考虑Oblivion / Skyrim中的锁定选择)。
我唯一的另一个想法是让所有组件处理状态更改事件并与相关系统进行通信以禁用其已注册的任何内容,并在切换回此状态时重新启用它。
第二个(将对象标记为已禁用)和第四个(使每个组件都处理状态更改)似乎是我的最佳想法,但是没有一个想法特别出色。
还有其他人对此有其他想法吗?
编辑当我谈论输入专门在这个问题上,它可能意味着能够发送消息/事件的实体,如碰撞,定时器事件等的任何系统...