我一直在努力创建自己的实体组件系统,并且可以通过执行以下操作来获取组件:

const auto& component = entity->GetComponent<ComponentType>();

上面的函数将如下所示:
template <typename TyComponent>
TyComponent* Entity<T>::GetComponent() const
{
  return &(GetComponent(TyComponent::Id());
}

然后根据找到的关联ID返回一个组件,否则返回nullptr
  • 我正在做的事可行吗?
  • 是否有办法确保只能从Component派生类型
    用作GetComponent的参数?
  • 最佳答案

    这样的设计还可以。

    如果有人尝试GetComponent<Foo>,您将已经收到编译时错误,但是Foo没有静态的Id()函数。这样可以给您带来一点安全。

    但是,它仍需要更改才能编译。这是我的处理方式:

    Component * GetComponent(int id) { ... }
    
    template <typename TyComponent>
    TyComponent* Entity<T>::GetComponent() const {
      return dynamic_cast<TyComponent*>(GetComponent(TyComponent::Id()));
    }
    

    现在,如果不是从TyComponent派生Component,这将产生一个编译错误。 (尽管如此,组件至少需要一个虚函数才能工作。)

    07-24 09:25