-1

我正在我的 c++ 游戏引擎中实现 Lua 脚本引擎,我想知道存储和执行 Lua 脚本的最佳方式是什么。我有很多场景节点,每个节点都可以分配自己的脚本。为该特定脚本的每一帧调用lauL_dofile(...)是一个可行的选择,还是有更好的方法?例如,有没有办法存储已经解析的脚本?我在看luaL_loadfilelua_pcall。我以为我会用第一个加载脚本,并在需要时用第二个调用它们,但是 lua_pcall 似乎没有唯一的 id 作为参数,那么我应该如何知道要执行哪个脚本呢?

4

2 回答 2

1

如果你打算使用 Lua API,你需要熟悉 Lua 堆栈。你可以学习做的最重要的事情之一就是理解如何阅读Lua API 文档。对于每个函数,右侧都有一个关于它如何影响堆栈的符号(如果它完全修改了堆栈)。

luaL_loadfile加载一个文件并将该文件作为 Lua 函数推送到堆栈上。lua_pcall在栈上执行一个函数。但它有一些关于它如何做事情的警告。

就堆栈而言,通过 Lua 调用函数的方式很简单。你推送你​​想要调用的函数。然后你按顺序从头到尾推送所有参数。然后你发出你对该函数的调用。lua_pcall以这种方式工作。这意味着要执行的函数的位置总是 nargs + 1,相对于堆栈的顶部,其中nargs是您传递给函数的参数的数量。

请注意,这lua_pcall将从堆栈中弹出函数(连同所有参数)。如果你刚刚加载了文件,这将是Lua 中对该函数的唯一引用。因此,您将无法再次执行该文件。您应该在将其参数压入堆栈之前复制该函数,使用lua_pushvalueto copy it。您可能应该将它贴在LUA_REGISTRYINDEX桌子上或其他东西上,以便保留它的价值。

于 2012-10-01T05:42:52.307 回答
0

正如我所评论的,您通常luaL_loadfile在初始化时调用。加载的文件通常定义一些 [global] 名称(或填充一些全局表中的一些槽)作为 Lua 函数。lua 5.2 文档lua_call给出了如何调用其中一个的示例(第 4 节) 。您将通过在 Lua 堆栈上推送适当的内容,在应用程序的适当位置执行此类调用(可能使用lua_pcallor )。lua_call

于 2012-10-01T05:16:34.460 回答