ECS 和游戏中的适当用法
ECS and appropriate usage in games
我一直在阅读有关实体-组件-系统的信息,我想我理解了基本概念:
实体只是 ID,其组件存储在数组中以减少缓存未命中。然后,系统迭代这些数组中的一个或多个,并处理组件中包含的数据。
但我不太明白这些系统应该如何有效和干净地与一个和另一个系统进行交互。
1: 如果我的实体有健康成分,我将如何破坏它? 如果健康状况低于或等于 0,仅仅做health -= damage
并不能解释死亡。但是,向组件添加damage()
函数将违背组件只是数据的观点。基本上:系统如何处理需要响应其更改并根据其更改更改其他组件的组件?(无需将损坏代码复制并粘贴到每个可能造成损坏的系统中)
2:组件应该是没有函数的纯数据结构。我如何最好地处理特定于实体的行为,例如在死亡时爆炸。用像explodesOnDeath=false
这样的内存浪费数据填充健康组件似乎是不切实际的,因为许多实体中只有一个或两个会在死亡时真正爆炸。我不知道如何优雅地解决这个问题。
这些问题有没有共同的方法?
易于修改(例如Lua脚本)和高兼容性机会对我来说很重要,因为我真的很喜欢具有高模组潜力的游戏。 :)
使用语言: C++
我也是该领域的新手,但以下是我对 ECS 模型的经验:
系统如何处理需要响应其更改并根据其更改更改其他组件的组件?
正如您正确指出的那样,组件只是数据的容器,因此不要为它们提供功能。所有逻辑都由系统处理,每个新逻辑由不同的系统处理。因此,将"造成损害"的逻辑与"杀死实体"的逻辑分开是一个不错的选择。通讯 在伤害系统和死亡系统之间(换句话说,什么时候应该杀死一个实体)可以基于健康组件。
可能的实现:
您通常有一个系统(损害系统)来计算实体的新运行状况。为此,它可以使用有关实体的各种信息(组件)(也许您的实体有一些盾牌来保护它们等)。如果生命值低于 0,伤害系统不在乎,因为它的唯一目的是包含造成伤害的逻辑。
除了伤害系统,你还需要某种死亡系统,如果生命值低于0,它会检查每个实体。如果是这种情况,则会采取一些措施。由于每个实体都会在死亡时(这就是为什么你的explodesOnDeath=false
不是一个坏主意的原因),拥有一个DeathComponent来存储某种死亡动画的枚举(例如爆炸或消失)、声音文件的路径(例如花哨的爆炸声音)和其他你需要的东西是很有用的。
通过这种方法,所有损害计算都位于一个地方,并与例如实体死亡的逻辑分开。
希望这有帮助!
- 这个指针在c++中的用法
- 在C++游戏中与库存系统作斗争
- 换位表导致测试失败(但在游戏中运行良好)
- Craps游戏问题,忽略if语句
- 当C++中需要自动删除时,这是静态的正确用法吗?
- 矢量下标超出SFML游戏中的范围
- 我是 c++ 的新手.学习基本知识后,我想做井字游戏.对于印刷板,我在下面写代码,但它显示错误
- libstdc++ 文件系统中未初始化的用法?
- 我在贪吃蛇游戏中收到了错误代码 -1073741571
- 复制和交换习惯用法与移动操作之间的交互
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 命名参数习惯用法和(抽象)基类
- 我应该在简单的策略游戏中为各个派系使用类吗 - C++
- 游戏体验和升级
- 我的代码运行良好,但在游戏循环中中断
- 如何使用 SFML 在贪吃蛇游戏中定义游戏结束?
- 我可以使用任何好的逻辑来阻止计算机将 O 放在井字游戏中的现有 X 上
- 省略号在C++中的所有用法
- () 在 C++ 11 中的特殊而奇怪的用法?
- ECS 和游戏中的适当用法