C++映射到 lua 文件的 lua 表

C++ lua table mapped to lua file

本文关键字:lua 文件 C++ 映射      更新时间:2023-10-16

如何在C++中创建一个lua表映射到一个lua脚本,其中脚本定义了表的属性和方法,因此生成的lua文件如下所示:

Script.test = 5
function Script:Update()
end

因此,此脚本可以多次读取,但每次它都应该在C++中获得自己唯一的表。

这个想法是,从C++我想调用每个唯一的Update()方法并能够读取/设置其测试变量。

假设您正在制作一个视频游戏,我告诉您,如果您制作这样的脚本并将它们附加到模型,游戏将每帧运行 Update() 方法,并且您定义的变量是该脚本/模型的本地变量。

这个答案只是为了详细说明我上面的评论。实现您所描述的内容的一个简单想法是直接在脚本文件中创建该本地表,并在最后返回该表。

local Script = {}
Script.test = 5
Script.foo = "bar"
function Script:Update()
end
return Script

这是将 lua 模块放入其自己的命名空间并避免全局范围污染的常用方法。

您可以从堆栈中获取并使用返回的Script

,如下所示:
// load and execute your script
luaL_dofile(L, "script.lua");
// Run Script:Update()
lua_getfield(L, -1, "Update");
lua_pushvalue(L, -2);
lua_call(L, 1, 0);

您可以将上述代码片段包装到函数中,以便更轻松地根据需要多次调用。您甚至可以通过将已编译script.lua缓存在某个位置来提高效率,以避免每次调用此函数时重新解析和重新创建包装函数。例如:

lua_getfield(L, LUA_REGISTRYINDEX, "cached_script");
if (lua_isnil(L, -1))
{
  luaL_loadfile(L, "script.lua");
  lua_pushvalue(L, -1);
  lua_setfield(L, LUA_REGISTRYINDEX, "cached_script");
}
lua_pcall(L, 0, 0, 0);
// etc.