Data structures 如何处理ECS中的动态分层实体
这是一个类比:我有一个有机体,它是由细胞组成的,而细胞又可以进一步由一堆附件组成 我目前拥有的是一种子/父级之间的事件链,用于处理连接和分离组件(可能会影响链上的任何内容),它根本不涉及ecs,它们是实体中的函数Data structures 如何处理ECS中的动态分层实体,data-structures,game-engine,entity-component-system,Data Structures,Game Engine,Entity Component System,这是一个类比:我有一个有机体,它是由细胞组成的,而细胞又可以进一步由一堆附件组成 我目前拥有的是一种子/父级之间的事件链,用于处理连接和分离组件(可能会影响链上的任何内容),它根本不涉及ecs,它们是实体中的函数 现在我已经使用了事件组件(用于对象上的鼠标事件)。如果我希望系统是纯的,我会在附加组件时创建附加组件吗?即使如此,我如何将所有必要的收件人发送到使用该组件的系统?用这种方式而不是一系列功能来处理它是否值得?有更好的方法吗?免责声明:我不确定我是否正确理解了你的问题。如果不是,我为谣言道
现在我已经使用了事件组件(用于对象上的鼠标事件)。如果我希望系统是纯的,我会在附加组件时创建附加组件吗?即使如此,我如何将所有必要的收件人发送到使用该组件的系统?用这种方式而不是一系列功能来处理它是否值得?有更好的方法吗?免责声明:我不确定我是否正确理解了你的问题。如果不是,我为谣言道歉
为了处理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\u type
是您用于实体标识符的类型,entity\u null
是您的表达方式-这尚未设置。这两件事主要取决于实际执行情况。例如,在my own()中存在entt::null
,这是一种在类似这样的情况下使用的null实体
让我们现在考虑层次结构中的通用节点: *
parent
是父节点的实体标识符,因此您可以轻松地将树(层次结构)从叶遍历到根。
*first
是第一个子节点的实体标识符,即当前标识符为根节点的子树的叶或内部节点列表。
*prev
和next
是当前节点的同级实体标识符
当您想要访问节点的所有子节点时,可以从第一个
实体(其第一个子实体)开始,通过访问下一个
一次迭代一个,直到它变为空。当您想从节点返回到其父节点时,只需使用parent
此解决方案的一个优点是,子项列表是根据组件隐式定义的,您不必为它们使用std::vector
或类似的工具。因此,您的组件中没有动态分配的内存来创建层次结构
如果你感兴趣,我也写了一篇关于这个话题的文章。如果你想了解更多细节,你可以阅读