1

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

此函数不起作用,它什么也不返回和/或有转换问题。

4

1 回答 1

1

我认为 C 风格的转换是未定义的行为。

据我所知,所有组件类(如 SpriteRenderer、Rigidbody 等)都源自ComponentUnity。所以我们可以使用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相对较慢,以防万一您真的很在意性能。

于 2021-02-04T05:48:18.510 回答