Lua 5.2:为每个脚本创建不同的环境。

这是我面临的问题的简化版本:

[bot0.lua]

function OnHit(bot)

//bot结构和vec3是使用SWIG生成,并注册到我维护的“全局”lua_State中的。
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(<全局lua_State,其中包括vec3等...)

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中注册的函数)。

问题是bot总是变成绿色,因为bot1.lua OnHit是加载的最后一个bot文件。我认为使用lua_newthread,我将能够为每个创建的“线程”有一个新的OnHit定义,这将为机器人分配适当的颜色,因为在使用luaL_dostring时使用了不同的lua_State。但实际上,最后一次加载的OnHit会覆盖先前在全局lua_State环境中的OnHit。

我的问题是:如何为每个脚本创建不同的环境,以便对于正确的bot->script->L调用正确的OnHit,并且我仍然可以访问在我创建的“全局”lua_State环境中注册的所有函数(例如我的vec3,GetBot等...函数)?

[编辑]

经过更多研究,我认为我需要在C中能够“沙箱”。我对吗?

[编辑]

实际上并不是真正的沙箱,因为我希望如果在脚本环境中查找失败,则在全局环境中进行查找。这是否可能?

点赞
用户1847592
用户1847592

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()" );
2013-04-16 05:46:46