我正在我的c ++游戏引擎中实现Lua脚本引擎,我想知道存储和执行Lua脚本的最佳方法是什么。我有很多场景节点,每个场景节点都可以分配自己的脚本。调用 lauL_dofile(...)特定脚本的每一帧都是可行的选择,还是有更好的方法?例如,有没有办法存储已经解析过的脚本?我在看 luaL_loadfile 和 lua_pcall 。我以为我会用第一个加载脚本,并在需要时用第二个调用它们,但是lua_pcall似乎没有唯一的id作为参数,所以我该如何知道要执行哪个脚本?
答案 0 :(得分:1)
如果您要使用Lua API,则需要熟悉Lua堆栈。你可以学到的最重要的事情之一是理解如何阅读the Lua API docs.对于每个函数,右边都有一个关于它如何影响堆栈的符号(如果它完全修改了堆栈)。
luaL_loadfile
加载文件并将该文件作为Lua函数推送到堆栈中。 lua_pcall
在堆栈上执行一个函数。但它有很多关于它如何做的警告。
通过Lua调用函数的方式就堆栈而言很简单。您按下要调用的功能。然后按顺序从头到尾推送所有参数。然后你发出你对该功能的调用。 lua_pcall
以这种方式运作。这意味着要执行的函数的位置总是 nargs + 1
,相对于堆栈的顶部,其中nargs
是您传递给的函数的参数数量。功能
请注意lua_pcall
将从堆栈中弹出函数(以及所有参数)。如果您刚刚加载了该文件,那么这将是Lua中该函数的唯一引用。因此,您将无法再次执行该文件。您应该在使用lua_pushvalue
to copy it将其参数推送到堆栈之前复制该函数。你可能应该把它放在LUA_REGISTRYINDEX
表格中,这样就可以保留它的值。
答案 1 :(得分:0)
正如我评论的那样,您通常在初始化时调用luaL_loadfile
。加载的文件通常定义一些[全局]名称(或在某些全局表中填充一些插槽)作为Lua函数。 lua 5.2 documentation给出了如何调用其中一个的示例(§4lua_call
)。您可以在应用程序的适当位置执行此类调用(可能使用lua_pcall
或lua_call
),方法是在Lua堆栈上推送适当的内容。