我尝试使用lua_setupvalue
在其自己的环境中加载和执行脚本。此脚本将使用我在加载脚本之前已注册的usertypes。问题是脚本无法找到早期注册的函数和类。
std::string lua_code("print(entity.getId())");
sol::state state;
lua_newtable(state);
//register classes and functions here
state.new_usertype<Entity>("Entity",
sol::constructors<sol::types<>>(),
"getId", &Entity::getId
);
state.set_function("print", print);
lua_loadstring(state, lua_code.c_str()); //load unsafe lua code
lua_pushvalue(state, 1); //create a copy of the table
lua_setupvalue(state, -2, 1); //set the environment for the script earlier
state["entity"] = entity; //pass the entity object
lua_call(state, 0, 0);
运行此操作后我收到错误:
attempt to call a nil value(global 'getComponent')
我在这里尝试的是为所有实体(在实体组件系统中)重用一个lua_state脚本。这就是为什么我试图只注册类和函数一次并在不同的环境中调用实体脚本,但使用早期注册的数据。