【问题标题】:Entity Component System confusion实体组件系统混乱
【发布时间】:2016-01-23 19:36:43
【问题描述】:

现在,在我开始之前,我想说我知道没有标准的方法来实施 ECS。但是,我对一种方法感兴趣,但对一件特定的事情感到困惑。

假设您有一个带有 TransformComponent(包含一个位置)和一个 RenderComponent(包含一个 Sprite)的实体,并且您还有一个与实体分开的 RenderSystem。 RenderSystem 将使用 RenderComponent 处理所有组件的渲染,并且不会关心它附加到哪个实体。但是由于 Sprite 需要一个位置,所以 RenderSystem 也需要 TransformComponent。

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

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

【问题讨论】:

    标签: c++ entity-component-system


    【解决方案1】:

    这部分是调用Entity Handler,需要做很多工作。

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

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

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

    现在你的实体只是一个索引和一个组件索引数组。

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

    因此,如果系统需要更新速度组件,您需要做的就是遍历您的实体,检查是否存在速度组件并更新它。

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-05
      • 2018-10-11
      • 2016-11-05
      • 2018-08-13
      • 2020-10-18
      • 2014-07-06
      • 1970-01-01
      • 2017-05-28
      相关资源
      最近更新 更多