如何将现有/创建/实例化的类对象推送到 Lua 脚本中使用?

大多数绑定库/软件包都能很清楚地指导如何暴露类类型,以便可以在 Lua 脚本中创建它。

我实在很难将已创建/实例化/分配的类对象传递给 Lua 脚本,以便您可以从 Lua 脚本中调用其已暴露/绑定的方法(也在 C++ 端更新对象)。

如果这还不清楚,我将提供这个现实例子,这是我目前正在处理的问题。

我正在使用 Lunar 将 AI Agent 类方法暴露给 Lua。虽然它起作用, 我可以在 Lua 脚本中创建 AIAgents..但无论如何,我不是在 Lua 上进行编程,我正在使用 Lua 为我的 AI Agent 编写脚本,它是我的游戏引擎的一部分,由游戏引擎创建,更新/碰撞检测和响应/绘图都由 C++ 代码完成,脚本唯一要做的就是为代理提供决策代码(在代理更新方法上调用的 Lua 协程) 。此决策代码可以访问某些已注册的(通过 Lunar)方法(GetHP、GetNAmmunition、GetPlayerPos 等)。

那么,如何将对象传递给脚本呢?像这样:

//- 在 AIAgent 构造函数中调用的虚假代码,或类似操作
lua_pushObject( luaState, this );
lua_setGlobal( "aiAgentFromC++", -1 ); // 通过 "aiAgentFromC++" 全局变量暴露对象

请注意,方法已经暴露,因为我可以在脚本中创建新对象,我只是不知道如何将我已经在 C++ 端拥有的对象传递给脚本。

点赞
用户847349
用户847349

LuaBridge 是我认为最容易的方法。它还很轻量化且无需依赖。你说:

我真正困难的是如何给 Lua 脚本已经创建/实例化/分配的类对象

它就是做这个的。

一个示例: C++

class A {
public:
    void print(int x) {
        std::cout<<x<<std::endl;
    }
};

RefCountedPtr<A> GiveMeA()
{
    static RefCountedPtr<A> a(new A);
    return a;
}

int main()
{
    lua_State *L = lua_open();
    luaL_openlibs(L);
    int s = luaL_loadfile(L, "test.lua");

    luabridge::getGlobalNamespace(L)
        .beginClass<A>("A")
        .addConstructor<void (*)()>()
        .addFunction("print",&A::print)
        .endClass()
        .addFunction("GiveMeA",&GiveMeA);

    if ( s==0 ) {
        s = lua_pcall(L, 0, LUA_MULTRET, 0);
    }
    report_errors(L, s);
    lua_close(L);
}

在 Lua 中:

local a=A()
a:print(42)
local b=GiveMeA() --created on the C++ side
b:print(42)
2012-11-11 20:41:20