首页 文章

实体组件系统混乱

提问于
浏览
0

现在,在我开始之前,我想说我知道没有标准的方法来实现ECS . 但是,有一种我感兴趣的方法,但对一个特定的东西感到困惑 .

假设您有一个包含TransformComponent(包含位置)的实体和一个RenderComponent(包含一个Sprite),并且您还有一个与实体分开的RenderSystem . RenderSystem将使用RenderComponent处理所有组件的呈现,而不关心它附加到哪个实体 . 但由于Sprite需要一个位置,因此RenderSystem也需要TransformComponent .

现在是我感到困惑的部分,如果所有组件都存储在它们自己的组件类型的向量中,我将如何获得同时具有TransformComponent和RenderComponent的所有实体?我不想使用循环遍历每个系统中所有实体的朴素方法,拉出具有这两个组件的实体,而是在组件类型的向量中包含每个组件 . 此外,系统如何知道2个组件属于同一个实体?组件是否附加了EntityID?

编辑:我刚刚意识到一些事情,如果RenderSystem循环遍历所有RenderComponents并获取实体,然后检查该实体是否也包含TransformComponent,然后它可以渲染它 . 但是那种方式破坏了整个“系统不关心实体”,这也要求组件具有EntityID,我仍然不确定它是否应该具有 . 有人请为我澄清这一切 .

1 回答

  • 1

    这部分是调用实体处理程序,这是需要大量工作的东西 .

    我知道的最简单的形式是这样的:

    将每个组件移动到一个大数组(缓存为King) . 每个组件都需要一个枚举:

    enum E_Component {
    
      Velocity,
      Position,
      ...
    };
    

    现在你的Entity只是一个索引和一个组件索引数组 .

    struct Entity {
    
      unsigned index;
      unsigned components[NB_COMPONENTS]; // -1 if nothing
    };
    

    因此,如果系统需要更新速度组件,您需要做的就是循环实体,检查是否有速度组件并更新它 .

    ==>系统不关心实体,只关心组件 .


    有很多更好的方法来做,看看这个article

相关问题