这是我遇到的问题的简化版本:
[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->script->L 调用正确的 OnHit,并且我仍然可以访问所有功能(例如我的 vec3、GetBot等...函数)在我创建的“全局”lua_State 环境中注册?
[编辑]
经过更多的研究,我认为我需要的是能够在 C 中“沙盒”。我对吗?
[编辑]
实际上并不是真正的沙盒,因为我想如果在脚本环境中查找失败,则会对全局环境进行查找。甚至可能吗?