【问题标题】:How to handle dynamic hierarchical entities in ECS如何处理 ECS 中的动态分层实体
【发布时间】:2019-12-05 17:33:32
【问题描述】:

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

我目前拥有的是一种子/父母之间的事件链,用于处理附加和分离组件(这可能会影响链上的任何东西),它根本不涉及 ecs,它们是实体中的函数。

现在我已经使用了事件组件(用于对象上的鼠标事件)。如果我希望系统是纯的,我会在附加组件等时创建附加组件吗?即便如此,我如何才能让所有必要的接收者进入使用该组件的系统?以这种方式而不是一系列功能来处理它是否值得?有没有更好的办法?

【问题讨论】:

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


    【解决方案1】:

    免责声明:我不确定您的问题是否正确。如果不是,我为谣言道歉。


    为了在 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,它是一种 null 实体,可以在这种情况下使用。

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

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

    此解决方案的一个附加是子列表是根据组件隐式定义的,您不必为它们使用std::vector 或类似名称。因此,您无需在组件中动态分配内存来创建层次结构。

    如果您有兴趣,我还写了一个post 关于这个主题。如果您想了解更多详细信息,可以阅读它。

    【讨论】:

      猜你喜欢
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多