0

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

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

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

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

4

1 回答 1

1

这部分称为实体处理程序,它可能需要大量工作。

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

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

enum E_Component {

  Velocity,
  Position,
  ...
};

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

struct Entity {

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

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

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


有很多更好的方法,看看这篇文章

于 2016-04-15T18:08:28.023 回答