C++ 更改lua_线程的_ENV(使用C API)

C++ 更改lua_线程的_ENV(使用C API),c++,lua,luabridge,lua-5.3,C++,Lua,Luabridge,Lua 5.3,这适用于多人游戏,其中NPC脚本将加载并缓存为单个lua_状态下的函数块,然后每次玩家与NPC交互时,都会创建一个新的lua_线程,从全局lua_表中提取一个缓存函数并推送到线程堆栈上,然后线程恢复(npc脚本在完成之前产生了好几次) 我正在尝试使用C API更改lua线程的环境,以便已加载/运行的函数将无法更改全局变量/让其他在不同线程上运行的函数更改它们 我通过改变函数环境,在脚本的开头添加了这段代码,从而达到了预期的效果。但是我希望使用C API端来实现这一点,这样我就不必将这段代码粘贴到

这适用于多人游戏,其中NPC脚本将加载并缓存为单个lua_状态下的函数块,然后每次玩家与NPC交互时,都会创建一个新的lua_线程,从全局lua_表中提取一个缓存函数并推送到线程堆栈上,然后线程恢复(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
10
60
如果npcB先运行,然后产生,那么npcA运行,然后npcB恢复。 npcB将打印

10
25
10
60

这是有问题的

一个线程没有
\u ENV
变量。一个编译块(一个Lua函数值)确实有它,可以用
n=1设置。是的。你应该创建单独的函数(使用
Lua\u load
)对于每个线程,然后使用
lua\u setupvalue
设置此函数的环境。老实说,您正在尝试解决一些没有问题的问题。全局变量是指全局变量;如果您不想这样做,请使用局部变量。@Green,是的,但不是。这只适用于主块,即直接从源代码加载的块。它是d不过oesn不适用于函数。唯一安全的方法是使用环境参数
load
loadfile
,其他一切都是黑客行为,很可能在某个时候破坏。@newbane2-根据DarkWiiPlayer的评论,我重新表述了我的评论:你应该通过Compile为每个线程创建一个单独的函数使用
Lua\u load
加载相同的Lua代码,然后使用
Lua\u setupvalue
为此函数设置特定于线程的环境。从Lua代码编译保证函数将只有一个upvalue。线程没有
\u ENV
变量。编译的块(Lua函数值)没有,可以通过使用
n=1设置。是的。您应该创建单独的函数(使用
lua\u load
)对于每个线程,然后使用
lua\u setupvalue
设置此函数的环境。老实说,您正在尝试解决一些没有问题的问题。全局变量是指全局变量;如果您不想这样做,请使用局部变量。@Green,是的,但不是。这只适用于主块,即直接从源代码加载的块。它是d不过oesn不适用于函数。唯一安全的方法是使用环境参数
load
loadfile
,其他一切都是黑客行为,很可能在某个时候破坏。@newbane2-根据DarkWiiPlayer的评论,我重新表述了我的评论:你应该通过Compile为每个线程创建一个单独的函数使用
Lua_load
加载相同的Lua代码,然后使用
Lua_setupvalue
为此函数设置特定于线程的环境。从Lua代码编译可确保函数只有一个upvalue。