我正在阅读关于 ECS 的文章,这些文章显然非常适合开发游戏。
我遇到了一个问题,或者一个问题,我会举例说明这个(这正是我遇到的问题)。
我有多个组件Boss
, Minion
, Player
, Weapon
, Name
. 首先,我name
在Player
组件中添加了一个字段。但是由于这些组件中的每一个都可以命名,所以我很想将它模块化并创建一个Name
组件。大多数系统不会以相同的方式使用该名称,但有些会,主要是DebugSystem
.
事实上具有组件的实体Player
不能具有Name
组件,但应该。我怎样才能轻松处理这个?
那是 :
- 我只能用组件创建一个实体
Name
。 - 当我使用组件创建实体时,
Player
组件Name
已经存在或应该自动创建。如果可能,直接在另一个组件中获取名称,例如entity.GetComponent<Player>().name
.
理想情况下,该名称可以在具有名称的任何组件之间共享。它让我想起了 OOP 中的钻石问题,但 ECS 不是部分创建来解决这个问题的吗?
问题 1) ECS 中是否有标准方法来处理这个问题,或者应该由最后CreateEntity()
添加缺失组件的函数手动处理?
关于 ECS 的其他一般问题:
我从继承Entity类开始,做生产链,如果我正确理解了原理(类本身并不重要,但它会自动创建组件)。然后我创建了其他一些实体类,但最终它们实际上可能只是组件。最后我什至不知道 Entity 类是否应该是可继承的。
问题 2)实体类在 ECS 系统中是否从未被继承?
在很多介绍文章中,他们并没有谈到组件之间的交互,但是在q/a论坛中,他们通常会提出一个事件驱动的系统来解决问题。
问题 3)事实上,ECS 模式是否与消息系统模式不可分离,应该一起使用(至少在大多数情况下),或者是否有纯粹使用 ECS 模式的解决方案?一些答案说事件完全破坏了 ECS 的优势,另一些人则建议这样做。
问题 4)组件可以包含指向其他组件的指针吗?组件可以包含指向其他实体的指针吗?我知道大多数答案都说它只是一个工具,没有什么不好的,但我想保留 ECS 的优势,而不违背它的原则。
问题 5)系统可以有任何数据吗?我没有找到任何关于它的东西。我正在考虑一个基于回合的游戏,我必须在其中存储回合数。因为数据不是一个具体的组件(它是系统本身的一些数据),所以我很想 1)GameData
在一些像全局游戏状态一样的实体中创建一个单例组件 2)将数据放入TurnSystem
,假设一次只能玩一个游戏。