这适用于多人游戏,其中 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
这是有问题的