我正在尝试用 C++ 编写我的第一个游戏引擎,这将类似于 Unity 脚本的工作方式。我正在尝试制作一个组件系统。这是我的问题:
我想要一个包含我的组件的向量,因为我可能需要动态添加一些。出现问题的地方是当我想添加我的 Component 类的派生类时。下面是一个例子:
std::vector<Component*> components;
有了这条线,我无法做到这一点(我希望能够做到):
gameObject.GetComponent<TextRenderer>().text [...]
我仍然需要学习很多东西,我真的不完全理解这部分(我不理解模板,也找不到好的教程)代码,但这是我的 GetComponent 函数:
template<typename T>
inline T* GetComponent()
{
for (int i = 0; i < components.size(); i++)
if (typeid(components[i]) == typeid(T))
{
std::cout << "Found Component." << std::endl;
return (T*) &components[i];
}
}
此函数不起作用,它不返回任何内容和/或存在转换问题。
答案 0 :(得分:1)
我认为 C 风格的转换是未定义的行为。
据我所知,所有组件类(如 SpriteRenderer、Rigidbody 等)都源自 Unity 中的 Component
。所以我们可以使用 dynamic_cast
提供安全的向下转换。如果转换成功,则返回一个有效指针,否则返回 nullptr
。
这是我如何实施它的示例。
template<typename T>
inline T* GetComponent()
{
for (int i = 0; i < components.size(); i++)
{
T* downcasted = dynamic_cast<T>(components[i]);
if (downcasted)
{
std::cout << "Found Component." << std::endl;
return downcasted;
}
}
return nullptr; // Unity's GetComponent returns null when not found
}
另外请注意,dynamic_cast
相对较慢,以防万一您真的很关心性能。