存储脚本

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

点赞
用户841108
用户841108

正如我所评论的,通常在初始化时调用luaL_loadfile函数。加载的文件通常定义了一些全局变量(或填充了一些全局表的插槽),作为 Lua 函数。lua 5.2 文档提供了一个示例(第 4 章 lua_call)来说明如何调用其中一个函数。您将在应用程序的适当位置调用这些函数(可能使用 lua_pcalllua_call),并将适当的内容推到 Lua 堆栈上。

2012-10-01 05:16:34
用户734069
用户734069

如果您想要使用Lua API,您需要熟悉Lua栈。了解如何阅读Lua API文档是您可以学习的最重要的事情之一。对于每个函数都有一个右侧的符号,描述它对栈的影响(如果它根本修改了堆栈)。

luaL_loadfile 载入文件并将该文件作为Lua函数推入栈中。lua_pcall 在栈上执行一个函数,但它有一些关于操作方法的注意事项。

在Lua中通过堆栈调用函数的方法很简单。首先将要调用的函数推入栈中,然后按顺序从头到尾推入所有参数,最后执行该函数。lua_pcall 的工作方式就是这样。这意味着要执行的函数位置始终是相对于堆栈顶部的 nargs + 1,其中 nargs 是传递给函数的参数数量。

请注意,lua_pcall 将从堆栈中弹出该函数(以及所有参数)。如果您刚刚加载了该文件,此函数将是Lua中该函数的唯一引用。因此,您将无法再次执行该文件。在将其参数推入堆栈之前,应使用lua_pushvalue进行复制。最好将其存储在 LUA_REGISTRYINDEX 表中,以便其值得以保留。

2012-10-01 05:42:52