在研究了几种游戏设计模式之后,我为我的游戏引擎选择了Entity-Component-System(ES System)。我正在阅读文章(主要是T = Machine)并查看一些源代码,我认为我已经足够入门。
我正在努力的只有一个基本想法。如何处理相互依赖的实体组?
让我举一个例子:
假设我正在制作一个标准的空中射击游戏(例如Jamestown),并且我想构造一个具有多个不同但相互连接的部分的“老板实体”。分解可能看起来像这样:
- 船体:运动,渲染
- 大炮:位置(相对于舰体锁定),向英雄追踪\开火,受到伤害直到被禁用
- 核心:位置(相对于舰体锁定),向英雄追踪\射击,对伤害造成伤害直到被禁用,对舰组中的所有其他实体禁用(毁灭)
我的目标是将某些东西识别(并操纵)为独特的游戏元素,而不必每次我要构建新的聚合元素时都必须重写子系统。
如何在ES系统中实施这种设计?
- 我是否实现某种父子实体关系(实体可以有孩子)?这似乎与实体只是空容器的方法相矛盾,并使其感觉更面向对象。
- 我是否将它们实现为具有某些连接组件(BossComponent)和相关系统(BossSubSystem)的单独实体?我不禁认为这将很难实现,因为组件之间的通信方式似乎是一个巨大的陷阱。
- 我是否将它们实现为一个具有一组组件(ShipComponent,CannonComponents,CoreComponent)的实体?这似乎改变了ES System的意图(这里的组件似乎太像重量级的实体),但是我知道这一点,所以我想我会把它放在那儿。
- 我是否将它们实现为我提到的其他内容?
我知道在OOP中可以很容易地实现这一点,但是我选择坚持使用ES而不是OOP是我会坚持的。如果我需要打破纯粹的ES理论来实现此设计,我会(不像我以前没有折衷过纯粹的设计),但是出于性能原因,我宁愿这样做,而不是从糟糕的设计开始。
为了获得额外的荣誉,请考虑相同的设计,但是实际上每个“老板实体”都连接到由主体,主要核心和3个“老板实体”组成的更大的“ BigBoss实体”。这将使我看到至少3个维度的解决方案(祖父母-父母子女)...对我来说应该绰绰有余。