我想这个问题或其变体很常见,如果我的话是重复的,答案可以从其他地方获取,请告知。
我一直在研究游戏引擎设计,接触到了组件化实体模型。听起来很有前途,但我仍在研究它的实现。
我正在考虑一个系统,其中引擎由多个“子系统”组成,每个子系统管理某些方面,例如渲染、声音、健康、人工智能等。每个子系统都与一个组件类型相关联,例如健康子系统的健康组件。例如NPC、门、一些视觉效果或玩家等“实体”只是由一个或多个组件组成的,当它们一起时才能使实体具备其功能。
我确定了四个主要的信息传递渠道:组件可以向其当前实体中的所有组件广播、组件可以向其子系统广播、子系统可以向其组件广播,子系统可以向其他子系统广播。
例如,如果用户想要移动他们的角色,他们会按下一个键。输入子系统会捕获此键按事件并将其广播,然后该事件将被玩家子系统捕获。玩家子系统然后将此事件发送给所有玩家组件(因此是这些组件组成的实体),并且这些玩家组件将与其自身实体的位置组件通信以开始移动。
所有这些仅为了一个按键事件似乎有点冗长,我当然愿意改进这种架构。但无论如何,我的主要问题仍然是:
至于事件本身,我考虑将事件行为视为访问者模式。我想要的重要性在于,如果事件遇到它不支持的组件(例如移动事件与AI或健康没有直接关系),则会忽略该组件。如果事件找不到它正在寻找的组件,也无所谓。
访问者模式基本可行。但是,为了每种组件类型(例如visitHealthComponent、visitPositionComponent等)都需要虚函数,即使它与它们无关。我可以将这些函数留空(因此如果遇到这些组件,就会被忽略),但每次添加组件时,我都必须添加另一个函数。
我的希望是能够添加组件而无需必要地添加其他内容,并添加事件而不会干扰其他内容。
因此,我的两个问题是:
- 有没有改进我的设计的方法,例如效率、灵活性等?
- 处理事件的最佳方法是什么?