1

这适用于多人游戏,其中 NPC 脚本将作为函数块加载并缓存在单个 lua_State 上,然后每次玩家与 NPC 交互时,都会创建一个新的 lua_thread,从全局 lua_table 获取缓存的函数并推送到线程的堆栈上,然后线程被恢复(npc 脚本在完成之前产生了几次)。

我正在尝试使用 C API 更改 lua 线程的环境,以便已加载/运行的函数将无法更改全局变量/让它们被运行在不同线程上的其他函数更改。

通过将此代码添加到脚本的开头,我通过更改函数环境实现了预期的结果。但是,我想使用 C API 端来执行此操作,这样我就不必将此代码粘贴到每个脚本中。

local newgt = {}
setmetatable(newgt, {__index = _G })
local _ENV = newgt

示例代码 + 所需/当前输出

npcA.lua

x = 10
print(x)
y = 60

npcB.lua

print(x)
y = 25
player:someYieldingFunction()
print(y)

我希望 npcA 打印

10

和那个 npcB 打印

nil
25

当前的输出是(这不是我想要的)

如果 npcA 先运行 npcB 将打印

10
25

如果 npcB 先运行然后让步,则 npcA 运行,然后 npcB 恢复。npcB 会打印

10
60

这是有问题的

4

0 回答 0