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

时间:2013-04-14 06:06:44

标签: lua

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

[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中“沙盒”。我是对的吗?

[编辑]

实际上并不是沙盒,因为我希望如果在脚本环境中查找失败,则查找全局环境。它甚至可能吗?

1 个答案:

答案 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()" );