我有一个渲染系统,它遍历所有 MeshDrawData 组件并批量绘制它们。我的 ECS 实现只允许每个实体使用一种类型的组件。
现在我想代表“玩家”乒乓球拍。我的 OOP 心态是这样说的:
Pseudocode:
auto e = createEntity();
createSpriteComponent(e,...); // this creates a MeshDrawData internally for e entity.
createColliderComponent(e,...);
这行得通,但是假设现在我也想渲染一条线。如果我这样做:
Pseudocode:
auto e = createEntity();
createSpriteComponent(e,...); // this creates a MeshDrawData internally for the e entity.
createColliderComponent(e,...);
createLineComponent(e,...); // this creates a MeshDrawData internally for the e entity
在这里你可以看到问题.. 我为实体 e. 创建了两个 MeshDrawData 组件。
鉴于我的虚幻引擎背景,我创建了一个演员并向其添加组件。我一直认为在 ECS 中,实体类似于演员,但我发现我完全错了。
例如,您如何组织您的实体以允许使用我之前提到的用例?一个实体应该代表什么?
可能的解决方案:
- 永远不要使用在同一实体中创建相同 MeshDrawData 的 SpriteComponent 和 LineComponent 创建实体..(明显但容易出错)
- 为每个 SpriteComponent 和/或 LineComponent 创建一个子实体,并将它们添加到各自的子实体。这会起作用,但它会使实体层次结构树变长..不确定它是否更容易出错。...