我一直在努力创建自己的实体组件系统,并且可以通过执行以下操作来获取组件:
const auto& component = entity->GetComponent<ComponentType>();
上面的函数将如下所示:
template <typename TyComponent>
TyComponent* Entity<T>::GetComponent() const
{
return &(GetComponent(TyComponent::Id());
}
然后根据找到的关联ID返回一个组件,否则返回
nullptr
。用作
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
,这将产生一个编译错误。 (尽管如此,组件至少需要一个虚函数才能工作。)