Sol2 和 Lua 沙箱

我正在尝试使用 lua_setupvalue 在其自己的环境中加载和执行脚本。该脚本将使用我已经注册的用户类型。问题在于脚本无法找到之前注册的函数和类。

std::string lua_code("print(entity.getId())");
sol::state state;

lua_newtable(state);
//在此处注册类和函数
state.new_usertype<Entity>("Entity",
  sol::constructors<sol::types<>>(),
  "getId", &Entity::getId
);
state.set_function("print", print);

lua_loadstring(state, lua_code.c_str()); //加载不安全的lua代码
lua_pushvalue(state, 1); //创建表的副本
lua_setupvalue(state, -2, 1); //将环境设置为之前的脚本
state["entity"] = entity; //传递实体对象
lua_call(state, 0, 0);

运行后,我收到以下错误:

attempt to call a nil value(global 'getComponent')

我在这里尝试的是为所有实体(在实体组件系统中)脚本重用一个 lua_state。这就是为什么我尝试仅注册类和函数一次,并以之前注册的数据可用于它们的不同环境调用实体脚本的原因。

点赞