我想这个问题或它的变体得到了很多传播,所以如果我说的是重复的,而答案在别处,请通知我。
我一直在研究游戏引擎设计,并遇到过基于组件的实体模型。这听起来很有希望,但我仍在研究它的实施。
我正在考虑一个系统,其中引擎由几个“子系统”组成,这些“子系统”管理某些方面,如渲染、声音、健康、人工智能等。每个子系统都有一个与之关联的组件类型,比如健康的健康组件子系统。一个“实体”,例如一个 NPC、一扇门、一些视觉效果或玩家,简单地由一个或多个组件组成,当它们一起赋予实体其功能时。
我确定了四个主要的信息传递渠道:一个组件可以广播到其当前实体中的所有组件,一个组件可以广播到它的子系统,一个子系统可以广播到它的组件,一个子系统可以广播到其他子系统。
例如,如果用户想要移动他们的角色,他们会按下一个键。这个按键将被输入子系统拾取,然后广播事件并被播放器子系统拾取。播放器子系统然后将此事件发送到所有播放器组件(以及这些组件组成的实体),并且这些播放器组件将与其自身实体的位置组件通信以继续移动。
按键操作的所有这些似乎有点啰嗦,我当然愿意改进这个架构。但无论如何,我的主要问题仍然存在。
至于事件本身,我考虑了事件在访问者模式中的行为。我想要的重要性在于,如果事件遇到它不支持的组件(因为在移动事件中与 AI 或健康没有直接关系),它将忽略该组件。如果一个事件没有找到它所追求的组件,那也没关系。
访问者模式几乎可以工作。但是,它要求我对每种类型的组件(即 visitHealthComponent、visitPositionComponent 等)都有虚函数,即使它与它们没有任何关系。我可以将这些函数留空(因此,如果确实遇到了这些组件,它将被忽略),但是每次添加组件时我都必须添加另一个函数。
我的希望是我能够添加一个组件而不必在其他地方添加东西,并且添加一个事件而不会弄乱其他东西。
所以,我的两个问题:
- 在效率、灵活性等方面,我的设计是否可以进行任何改进?
- 处理事件的最佳方式是什么?