实体组件系统:将指针存储在组件到实体中

我想知道是否将一个指针存储在拥有组件的实体的每个组件中是一个坏主意。

比如我有一个组件“NPC”。 拥有这个组件的每个实体也必须有一个Position和Sprite组件。 有时我从我的系统中获得一个NPC组件列表,但是我也需要相应的Position和Sprite组件。 我可以检索实体,但是我必须input相当多的代码,而且比指针更加昂贵。

所以将一个指向实体的指针存储在一个组件中是一个坏主意?

一个明显的解决scheme是将entityId存储在每个组件结构或类中。 这样当你需要获取组件或者做一些特定于实体的逻辑时,你已经有了一个简单的方法来获取基于给定组件的entityId。

另一个可能稍微复杂但有一些有用的副作用的解决scheme是为每个组件分配一个唯一的ID,使用按位算术可以获得entityId,组件types或一些密集的数组索引以及唯一的版本号组件的ID。 这通常暗示在使用基于entityId的单个稀疏数组来管理组件池的情况下,以及将组件保持在caching友好的统一连续内存块中的内部密集数组。

把entityId和一个组件关联起来没什么不好,因为你还计划如何实现组件间或组件间或系统间的通信,这涉及到一个行为影响另一个特定实体的行为。 :)。

如果您的系统将返回包含某个组件的实体列表而不是组件列表本身,那么将会更好。

像阿什利这样的框架也有一个“家庭”类,用来让所有实体拥有一组组件。