ECS可以使实体具有多个给定类型的组件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ECS可以使实体具有多个给定类型的组件相关的知识,希望对你有一定的参考价值。
我最近被分配到基于实体组件系统的框架的代码。由于我没有这方面的经验,我有一个简单的问题:我能否假设一个实体最多可以拥有每种类型的一个组件?我的意思是:
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
这是正确的假设吗?当一个实体需要两个或多个相同类型的组件时,我无法想到任何情况。
嗯,实体组件系统没有神圣的圣经。但是我知道的许多实现都没有为此做任何规定,它们允许实体拥有或不拥有某种组件,但不支持多重性。同样,从设计的角度来看,这似乎是一个相当糟糕的想法(很多复杂的事情)。你可以使它工作,但你和我都不能提出一个用例。 KISS和YAGNI适用,这是一个合理的假设。如果你以后需要将组件添加两次或三次,则可以通过使用两种或三种不同的组件来轻松模拟。只有变量arity你需要改变系统的内部,但这似乎更奇怪。
我要提起我的神圣圣经然后说,是的,一个实体应该只有一个组件类型!否则就是亵渎神明!
你不能创造具有多个相同类型的组件的实体,否则你将面临永恒的诅咒。
我通常对这些东西很不满意但是当你允许你的系统将一个给定类型的多个组件附加到一个实体时,这种复杂性会扩散到系统的每个角落。
现在每个系统都必须反对这样的假设:对于任何组件类型,可以有更多的相同类型的组件附加到实体,此时你经常面对设计问题,比如物理系统在实体时应该做什么附有14个位置组件。当渲染系统发现一个具有15个运动组件但只有4个精灵的实体时,会发生什么?期望每个精灵组件的匹配运动组件?哪个运动组件用于哪个精灵?
当你只说“每个实体一个组件类型的一个组件实例”时,生活变得简单得多。
如果要聚合,那么只需将组件集成一些东西即可。而不是Bone
组件,使其成为一个存储骨骼列表的Skeleton
组件。而不是Pixel
组件,使其成为一个存储像素集合的Image
组件。这一切都很好,并不要求你违反和玷污上面的神圣诫命。
以上是关于ECS可以使实体具有多个给定类型的组件的主要内容,如果未能解决你的问题,请参考以下文章