我正在尝试为模拟进行实体组件系统设计。这就是现在让我感到困惑的地方。我正在尝试制作一个实体类
Entity.h
class Entity
{
public:
Entity();
virtual ~Entity() = 0;
//---------------------Methods---------------------//
void AddComponent(const shared_ptr<Component> component);
template<class T>
T* GetComponent() const;
//---------------------Members---------------------//
vector<shared_ptr<Component>> m_components;
}
Entity.cpp
template<typename T>
T* Entity::GetComponent() const
{
Component::component_type_t typeIndex = /*T::component_type*/
T* returnPtr = dynamic_pointer_cast<T>(m_components[component_type].get());
return returnPtr;
}
Component 类看起来像这样
class Component
{
public:
Component();
virtual ~Component() = 0;
//---------------------Methods---------------------//
//---------------------Members---------------------//
typedef enum component_type_t
{
MESH_T,
RIGIDBODY_T,
TRANSFORM_T,
NUM_TYPES
};
component_type_t componentType;
};
我想使用GetComponent()
的方式与 Unity3D 中的方式相同
Transform* t = GetComponent<Transform>()
但正如你所看到的,我还没有找到一种方法来做到这一点。我过去的做法是
class Entity
{
.....
Component* GetComponent(Component::component_type_t componentType) const
{
return m_components[component_type].get()
};
}
我只能用它作为
Transform* t = dynamic_pointer_cast<Transform>(GetComponent(Component::component_type_t::TRANSFORM_T));
显然,这很乏味。
所以我的问题是我可以使用某种形式吗?
class Entity
{
.....
template<class T>
T* GetComponent() const
{
Component::component_type_t typeIndex = /*T::component_type*/
T* returnPtr = dynamic_pointer_cast<T>(m_components[component_type].get());
return returnPtr;
};
}
我觉得继续std::vector<>
用于存储所有组件指针的清洁度和速度,这也是一个有效的设计吗?