【发布时间】:2020-05-19 17:01:08
【问题描述】:
我有一个渲染系统,它遍历所有 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 创建一个子实体,并将它们添加到各自的子实体。这会起作用,但它会使实体层次结构树变长..不确定它是否更容易出错。 ...
【问题讨论】:
标签: c++ entity game-engine entity-component-system