将 C++ 对象推送到 Lua

我需要帮助将在 C++ 中创建的游戏对象推送到我们的 Lua 环境中。这是一个例子,展示了我们在 C++ 中创建的 GameObjects :

class Player
{
public:
    Player(std::string pName, int ObjID)
    {
        this -> name = pName;
        this -> objectId = ObjID
    }
    std::string name;
    int objectId;

};

现在所有的对象都是在 C++ 中创建的,我们不想在 Lua 脚本中使用构造函数。我可以使用 sol 或 LuaBridge,我已经研究了它们的示例,它们展示了如何推送带有构造函数和函数的类,但是是否可以推送带有属性而不是函数的 userdata?这样在我们的 lua 脚本中,我们可以使用 obj.name 代替 obj:GetName()

一些关于我们如何创建对象以及希望如何推送它的更多细节:

Player* player1 = new Player("Player1", 1)
Player* player2 = new Player("Player2", 2)

然后希望我们能够以某种方式将其推送到环境中,感谢任何帮助!

我在使用 LuaBridge 时尝试过以下操作:

luabridge::getGlobalNamespace(this->lua_state)
        .beginClass<GameObject>("GameObject")
        .addProperty("Name", &GameObject::Name)
        .endClass();

但是据我所知,这只适用于在 Lua 中创建新类,而不是推送已创建的类。我也尝试了类似的 sol 示例。

原文链接 https://stackoverflow.com/questions/69984785

点赞
用户17073996
用户17073996

好的,经过查看评论中的建议和一些研究,我似乎已经能够使用 sol 弄清楚了。我的解决方案是为我的游戏对象创建一个小包装器:

class Lua_GameObject
{
public:
    Lua_GameObject(GameObject* obj) {
        this->real_obj = obj;
        objects.push_back(this);
    }

    std::string GetName() const {
        auto name_str = this->real_obj->GetName();
        int len = strlen(reinterpret_cast<const char*>(name_str));
        return std::string(name_str, name_str + len);
    }

    static std::vector<Lua_GameObject*> ObjectList() {
        return Lua_GameObject::objects;
    }

private:
    GameObject* real_obj;
    static std::vector<Lua_GameObject*> objects;
};

然后我在另一个文件中使用 sol 暴露这个类并创建对象,如下所示:

// 将 Lua_GameObject 暴露给环境
this->lua.new_usertype<Lua_GameObject>(
    "GameObject",

    // 禁止从 Lua 构造
    sol::no_constructor,

    // 名称属性
    "Name", sol::property(&Lua_GameObject::GetName),

    // 所有对象的列表
    "ObjectList", &Lua_GameObject::ObjectList
    );

现在每次我创建一个 Lua_GameObject,它都会自动添加到列表中,只需要添加一个句柄以稍后删除它们:

// 创建游戏对象
GameObject* obj = new GameObject("ObjName", 123);

// 创建新的 Lua 对象,这样它就会自动添加到 GameObject:ObjectList() 中
Lua_GameObject* lua_obj = new Lua_GameObject(obj);

感谢你们的帮助!

2021-11-17 00:33:55