如何将 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.
关于C++ lua表映射到lua文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19473500/