如何自动确定游戏对象的 ID?

How to automatically determine IDs for gameObject's?

我现在正在尝试用 C++ 制作 ECS(实体-组件-系统)。

这是我的游戏对象 class :

class GameObject
{
private:
    int ID
    /*gameobject name, tranform */
public:
    int GetID();
    
    template<class component>
    void AddComponent()
    {
        component::ComponentAdded(this->ID);
    }

    template<class component>
    component& GetComponent()
    {
        return component(); //todo :: think about how to access
    }

};

这是 Meshrenderer(我的组件之一):

struct MeshRenderer
{
    MeshRenderer();

    static std::vector<Mesh> meshes;
    static std::vector<Material> materials;
    static std::unordered_map<int, std::pair< int , int>> renderables; // gameobjectID, <mesh, material>

    static void ComponentAdded(int gameObjectID);
    static void SetMesh(int gameObjectID, Mesh& mesh);
    static void SetMaterial(int gameObjectID, Material& material);
};

我正在尝试修复 getcomponent :

scene->gameObjects[2]->GetComponent<MeshRenderer>().SetMesh(scene->gameObjects[2]->GetID(), object);

至:

scene->gameObjects[2]->GetComponent<MeshRenderer>().SetMesh(object);

但是我不知道如何在调用某些组件函数时自动给出gameObject的ID。

如果您能给我任何建议,我将不胜感激。

为了让 GameObject 的每个实例都具有唯一值,您可以:

  • 向 class GameObject
  • 引入静态计数器(实例化,而不是现有实例)
  • 在 class GameObject
  • 的构造函数中增加它
  • 在实例化继承`GameObject 的新对象时使用其当前值,方法是在其构造函数中将其分配给新对象的实例成员

计数器应该计算实例化(即不在析构函数中递减)而不是现有实例(即在析构函数中递减)。因为我假设 GameObjects 可能会被销毁,然后实例化新的。如果旧的之前被销毁,那最终可能会得到具有相同 ID 的新的。

这当然假设您程序中所有实例化的数量永远不会溢出您使用的任何类型。如果发生这种情况,事情就会出现问题。我希望你不需要那个。如果你这样做,我想我可能会选择一堆最近删除的 ID,用于新的实例化。然而,对于可能溢出 long long int 的那种数字,这可能会遇到内存问题。

(如果唯一性足以满足“很可能永远不会相同”而不是“保证是唯一的”,您可以查看“UUID”的概念。您必须判断您自己的可用性。)