现在,在我开始之前,我想说我知道没有标准的方法来实现ECS . 但是,有一种我感兴趣的方法,但对一个特定的东西感到困惑 .
假设您有一个包含TransformComponent(包含位置)的实体和一个RenderComponent(包含一个Sprite),并且您还有一个与实体分开的RenderSystem . RenderSystem将使用RenderComponent处理所有组件的呈现,而不关心它附加到哪个实体 . 但由于Sprite需要一个位置,因此RenderSystem也需要TransformComponent .
现在是我感到困惑的部分,如果所有组件都存储在它们自己的组件类型的向量中,我将如何获得同时具有TransformComponent和RenderComponent的所有实体?我不想使用循环遍历每个系统中所有实体的朴素方法,拉出具有这两个组件的实体,而是在组件类型的向量中包含每个组件 . 此外,系统如何知道2个组件属于同一个实体?组件是否附加了EntityID?
编辑:我刚刚意识到一些事情,如果RenderSystem循环遍历所有RenderComponents并获取实体,然后检查该实体是否也包含TransformComponent,然后它可以渲染它 . 但是那种方式破坏了整个“系统不关心实体”,这也要求组件具有EntityID,我仍然不确定它是否应该具有 . 有人请为我澄清这一切 .
1 回答
这部分是调用实体处理程序,这是需要大量工作的东西 .
我知道的最简单的形式是这样的:
将每个组件移动到一个大数组(缓存为King) . 每个组件都需要一个枚举:
现在你的Entity只是一个索引和一个组件索引数组 .
因此,如果系统需要更新速度组件,您需要做的就是循环实体,检查是否有速度组件并更新它 .
==>系统不关心实体,只关心组件 .
有很多更好的方法来做,看看这个article