data-structures - ECS中如何处理动态分层实体

标签 data-structures game-engine entity-component-system

这是类比:我有一个有机体,它由细胞组成,细胞可以进一步由多种附着物组成。

我目前拥有的是一种在 child / parent 之间处理附加和分离组件(这可能会影响链上的任何东西)的事件链,它根本不涉及 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_type是您用于实体标识符的类型和 entity_null是你的方式 - 这还没有设置。这两件事主要取决于实际实现。例如,在我自己的 ( EnTT ) 中存在 entt::null这是一种在这种情况下使用的空实体。

现在让我们考虑层次结构中的一个通用节点:
* parent是父节点的实体标识符,因此您可以轻松地从叶子到根遍历树(层次结构)。
* first是第一个 child 的实体标识符,即当前标识符是根节点的子树的叶子或内部节点的列表。
* prevnext是当前节点的兄弟节点的实体标识符。

当你想访问一个节点的所有子节点时,你从first开始。实体(它的第一个 child )并通过访问 next 一次迭代它们直到它变为空。当你想从一个节点返回到它的父节点时,你可以使用 parent .

此解决方案的一个优点是子项列表是根据组件隐式定义的,您不必使用 std::vector或类似的。因此,您没有在组件中动态分配内存来创建层次结构。

如果你有兴趣,我也写了一个 post关于这个话题。如果你想了解更多细节,你可以阅读它。

关于data-structures - ECS中如何处理动态分层实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57235844/

相关文章:

algorithm - 从列表的映射中输出在每个其他元素列表中不相交的元素集的映射

c++ - 启动具有特定变量值的派生类

audio - OpenAL-Soft 对源数量有上限吗?

c++ - 存储所有类实例的 vector ,并调用它们的成员函数

c# - 实体组件系统 c#

c++ - C++如何实现双向链表的迭代器

java - 使用 ANTLR 检查相似的表达式

c++ - 实体组件系统和共享公共(public)基类型的多个组件

java - 实体组件系统中的边界和位置

java - 哪个 Java 数据结构移动最后检索到的元素的位置?