ECS和游戏中的适当用法

时间:2017-11-26 15:01:46

标签: c++ entity

我一直在阅读有关实体组件系统的内容,我认为我理解基本概念:

实体只是将其组件存储在数组中的ID,以减少缓存未命中。然后,系统迭代这些数组中的一个或多个,并处理组件中包含的数据。

但我不太明白这些系统应该如何有效地和干净地互动。

1:如果我的实体有健康成分,我将如何破坏它? 如果健康状况低于或等于0,那么只做health -= damage就不会导致死亡。但是向组件添加damage()函数会违反组件只是数据的点。基本上:系统如何处理需要响应其更改并根据其更改更改其他组件的组件?(不将损坏代码复制并粘贴到每个可能造成损害的系统中)< / p>

2:组件应该是没有功能的仅数据结构。我如何最好地处理特定于实体的行为,如死亡爆炸。当只有一两个实体中的一个或两个实际上会在死亡时爆炸时,使用像explodesOnDeath=false这样的内存浪费数据来填充Health组件似乎是不切实际的。我不知道如何优雅地解决这个问题。

这些问题是否有共同的方法?

易于修改(适用于Lua脚本)和高兼容性对我来说非常重要,因为我非常喜欢具有高模态潜力的游戏。 :)

使用的语言:C ++

1 个答案:

答案 0 :(得分:2)

我也是该领域的新手,但这是我对ECS模型的经验:

系统如何处理需要响应其更改并根据其更改更改其他组件的组件?

正如您正确指出的那样,组件只是数据的容器,因此不要给它们提供功能。所有逻辑都由系统处理,每个新逻辑由不同的系统处理。因此,从“杀死一个实体”中分离“处理损害”的逻辑是一个很好的选择。通讯 在 DamageSystem DeathSystem 之间(换句话说,什么时候应该杀死一个实体)可以基于 HealthComponent

可能的实施:

您通常有一个系统( DamageSystem )来计算实体的新运行状况。为此,它可以使用有关实体的各种信息(组件)(可能您的实体有一些屏蔽来保护它们等)。如果健康状况低于0,那么 DamageSystem 并不关心,因为它的唯一目的是包含造成伤害的逻辑。

除了 DamageSystem 之外,你还想要某种 DeathSystem ,如果健康状况低于0,它会检查每个实体。如果是这种情况,有些采取行动。由于每个实体都死了(这就是为什么你的explodesOnDeath=false并不是一个坏主意),因此有一个 DeathComponent 可以存储某种死亡的枚举动画(例如爆炸或只是消失),声音文件的路径(例如花哨的爆炸声)和你需要的其他东西。

采用这种方法,所有损伤计算都位于一个地方,并与一个实体死亡的逻辑。

希望这有帮助!