如何在ECS中处理动态分层实体

时间:2019-07-27 20:31:48

标签: data-structures game-engine amazon-ecs entity-component-system

打个比方:我有一个生物,它是由细胞组成的,而细胞又可以由附着物的混杂物组成。

我目前拥有的是子/父母之间的一种事件链,用于处理完全不涉及ec的附加和分离组件(这可能影响链中的任何事物),它们是实体中的功能。

现在我已经使用了事件组件(用于对象上的鼠标事件)。如果我希望系统是纯净的,那么在附加组件等时会创建附加组件吗?即使那样,我如何将所有必需的接收者带到使用该组件的系统中?这样处理而不是一连串的功能是否值得?有更好的方法吗?

1 个答案:

答案 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是第一个子代的实体标识符,即当前标识符是根节点的子树的叶子或内部节点的列表。 * prevnext是当前节点的兄弟姐妹的实体标识符。

如果要访问一个节点的所有子节点,请从first实体(它的第一个子节点)开始,然后一次访问{{1} },直到它变为空。要从节点返回到其父节点时,可以只使用next

此解决方案的 plus 是子级列表是根据组件隐式定义的,您不必为它们使用parent或类似名称。因此,您没有在组件中动态分配内存以创建层次结构。

如果您有兴趣,我也为此主题写过post。如果您需要更多详细信息,可以阅读。