C++ |如何制作包含不同类别的多个对象的向量

时间:2021-02-04 03:37:19

标签: c++ visual-studio templates game-engine

我正在尝试用 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];
        }
}

此函数不起作用,它不返回任何内容和/或存在转换问题。

1 个答案:

答案 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 相对较慢,以防万一您真的很关心性能。

相关问题