微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

这是我的 GameObject 类:

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 的每个实例具有唯一的值,您可以:

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。