打个比方:我有一个生物,它是由细胞组成的,而细胞又可以由附着物的混杂物组成。
我目前拥有的是子/父母之间的一种事件链,用于处理完全不涉及ec的附加和分离组件(这可能影响链中的任何事物),它们是实体中的功能。
现在我已经使用了事件组件(用于对象上的鼠标事件)。如果我希望系统是纯净的,那么在附加组件等时会创建附加组件吗?即使那样,我如何将所有必需的接收者带到使用该组件的系统中?这样处理而不是一连串的功能是否值得?有更好的方法吗?
答案 0 :(得分:0)
免责声明:我不确定我是否正确回答了您的问题。如果不是,我为谣言道歉。
为了处理ECS中的层次结构,可以使用类似于以下内容的专用组件:
struct relationship {
entity_type first{entity_null};
entity_type prev{entity_null};
entity_type next{entity_null};
entity_type parent{entity_null};
// ... other data members ...
};
entity_type
是您用于实体标识符的类型,而entity_null
是您说的方式-尚未设置。这两件事主要取决于实际的实现。举例来说,在我自己的EnTT
中,存在entt::null
,它是一种空实体,可用于此类情况。
现在让我们考虑层次结构中的通用节点:
* parent
是父节点的实体标识符,因此您可以轻松地将树(层次结构)从叶到根。
* first
是第一个子代的实体标识符,即当前标识符是根节点的子树的叶子或内部节点的列表。
* prev
和next
是当前节点的兄弟姐妹的实体标识符。
如果要访问一个节点的所有子节点,请从first
实体(它的第一个子节点)开始,然后一次访问{{1} },直到它变为空。要从节点返回到其父节点时,可以只使用next
。
此解决方案的 plus 是子级列表是根据组件隐式定义的,您不必为它们使用parent
或类似名称。因此,您没有在组件中动态分配内存以创建层次结构。
如果您有兴趣,我也为此主题写过post。如果您需要更多详细信息,可以阅读。