我最近被分配到基于实体组件系统的框架的代码。由于我在这方面没有经验,我有一个简单的问题: 我可以假设一个实体最多可以拥有每种类型的一个组件吗?我的意思是:
int COMPONENT_COUNT; //number of different components available
class Entity
{
COMPONENT* component_list[COMPONENT_COUNT];
}
然后添加一个组件就像
component_list[component.id]=&component; //can't add more components of this type
这是正确的假设吗?当一个实体需要两个或更多相同类型的组件时,我无法想到任何情况。
答案 0 :(得分:2)
嗯,实体组件系统没有神圣的圣经。但是我知道的许多实现都没有为此做任何规定,它们允许实体拥有或不拥有某种组件,但不支持多重性。同样,从设计的角度来看,这似乎是一个相当糟糕的想法(很多复杂的事情)。你可以使它工作,但你和我都不能提出一个用例。 KISS和YAGNI适用,这是一个合理的假设。如果你以后需要将组件添加两次或三次,则可以通过使用两种或三种不同的组件来轻松模拟。只有变量arity你需要改变系统的内部,但这似乎更奇怪。
答案 1 :(得分:2)
我要提起我的圣经并说,是的,一个实体应该只有一个组件类型!不这样做是亵渎!
你不能创建具有多个相同类型组件的实体,否则你将面临永恒的诅咒。
我通常对这些东西很不满意但是当你允许你的系统将一个给定类型的多个组件附加到一个实体时,这种复杂性会蔓延到你系统的每个角落。
现在每个系统都必须违背这样的假设,即对于任何组件类型,可以有更多的相同类型的组件附加到实体,此时您经常面对设计问题,如物理系统当一个实体附加了14个位置组件时应该这样做。当渲染系统发现一个具有15个运动组件但只有4个精灵的实体时,会发生什么?期望每个精灵组件的匹配运动组件?哪个运动组件用于哪个精灵?
当你说,"每个实体一个组件类型的一个组件实例时,生活变得更加简单。"
如果您想要聚合,那么只需将您的组件集合成一些东西即可。而不是Bone
组件,使其成为存储骨骼列表的Skeleton
组件。而不是Pixel
组件,使其成为存储像素集合的Image
组件。这一切都很好,并且不要求你违反和玷污上面的神圣诫命。
答案 2 :(得分:0)
Urho3D允许多个相同类型的组件-有时它们的组件派生不止一次-例如,来自Drawable的StaticModel来自组件
当您创建新的组件类型时,您可以根据需要向“节点”(与实体相同)中添加任意数量的组件。使用Urho时,这几乎是一件令人讨厌的事情-总是在想“等等,这个Node有多少东西?”。出于什么目的?
就像其他人提到的那样,似乎很难证明所有那些总是进行1次迭代的额外for / while循环。.通过Urho,我通过使自己的规则不再添加一个类型的多个组件来解决它到节点...否则太混乱了