如何在游戏引擎中使用全局的lua_State *?

在我的引擎中,每个实体都有一个与之关联的 lua_State *。基本的 Entity 类有一个函数 linkScript(const char *scriptPath),这个函数会调用 luaL_dofile(luaState, scriptPath)。所有这些都非常完美,但是游戏还是相当小。我一直在阅读相关资料,发现我所做的被认为是不好的实践。建议我有一个全局的 lua_State *,并将所有的函数都加载到全局内存中。刚开始我想,“好的,简单的东西”,但我很快就遇到了一个问题:每个 Lua 文件都定义了它们自己的 init()tick()并且应用了一些 EventHooks。我该如何共享全局的 lua_State *,而不是让每个脚本都覆盖先前脚本的这些函数的定义呢?这些函数在每一帧或每次事件触发时都会被调用。我需要区分每个脚本的实现。

点赞
用户869951
用户869951

你基本上想把每个脚本都视为一个带有自己函数的对象。当你加载脚本并运行时,你不希望它的函数进入全局命名空间,而是进入与它专属的表格,并且有一个全局表格存储所有这些表格。

有很多方法可以做到这一点,但我想到的一个方法是:创建一个全局表格 allObjects,然后针对每个脚本执行以下操作:

-- object1Script.lua
allObjects.object1 = {
    init = function()
        ...
        end,
    tick = function()
        ...
        end
}

你对每个脚本都执行上述操作,但每个脚本在allObjects表格中创建一个不同的条目,第一个脚本为 object1,第二个脚本为 object2,等等。如果你不想为脚本命名,你可以使用一个数组,即 allObjects.insert({ ...表格初始化,tick等函数...})。你可以循环遍历 allObjects 表格来调用每个“对象”的 init()tick(),等等。

我认为上述是基本的方法,希望能激发你找到自己的方法。

2013-12-12 22:48:54