1

如何将 C++ 中的 lua 表映射到脚本定义表属性和方法的 lua 脚本,因此生成的 lua 文件如下所示:

Script.test = 5

function Script:Update()
end

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

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

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

4

1 回答 1

1

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

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.
于 2013-10-20T05:21:49.533 回答