这是我的问题的简化版本:
[bot0.lua]
function OnHit(bot)
// Where the bot structure and vec3
// generated using SWIG and registered to a
// "global" lua_State that I maintain.
bot.color = vec3( 1.0, 0.0, 0.0)
end;
[bot1.lua]
function OnHit(bot)
bot.color = vec3( 0.0, 1.0, 0.0)
end;
在加载时,对于每个脚本,我首先执行以下操作(伪代码):
bot->script->L = lua_newthread( <Global lua_State where vec3 etc... are registered> )
luaL_loadbuffer( bot->script->L, botXXX.lua ...
lua_call( bot->script->L, ...
然后在我的程序运行时,当机器人被击中时,我打电话给:
luaL_dostring( bot->script->L, "OnHit(GetBot(\"<the bot name>\")" );
(其中GetBot也是在全局lua_State中注册的函数)。
问题是僵尸程序总是变为绿色,因为bot1.lua OnHit在加载的最后一个僵尸文件中。我想通过使用lua_newthread,我将能够为每个创建的“线程”创建一个新的OnHit定义,它将为机器人分配正确的颜色,因为我在使用luaL_dostring时使用不同的lua_State。但事实上,加载的最新OnHit将覆盖全局lua_State环境中的前一个。
我的问题是:我如何为每个脚本创建一个不同的环境,以便为正确的bot-&gt;脚本&gt; L调用正确的OnHit,并且我仍然可以访问所有功能(例如作为我的vec3,GetBot等...函数)在我创建的“全局”lua_State环境中注册?
[编辑]
经过更多的研究,我认为我需要的是能够在C中“沙盒”。我是对的吗?
[编辑]
实际上并不是沙盒,因为我希望如果在脚本环境中查找失败,则查找全局环境。它甚至可能吗?
答案 0 :(得分:0)
bot0.lua
local bot = {}
function bot:OnHit()
self.color = vec3( 1.0, 0.0, 0.0)
end
return bot
bot1.lua
local bot = {}
function bot:OnHit()
self.color = vec3( 0.0, 1.0, 0.0)
end
return bot
main.lua
all_bots = {[0]=require"bot0", require"bot1"}
function GetBot(name)
if name == "bot #0" then
return all_bots[0]
elseif name == "bot #1" then
return all_bots[1]
end
end
在C程序中
luaL_dostring( bot->script->L, "GetBot('<the bot name>'):OnHit()" );