protobuf-lua版本(pblua)
google官方并没有protobuf 的 Lua版本,然后网易的大神开发出了 protoc-gen-lua ,可以让我们将 .proto 文件转成 lua 脚本在 Lua中使用。ulua在很早的版本中就已经支持它了。
pblua使用的是将protobuf协议文件编码成lua文件,然后在lua程序中require进来,赋值,序列化,发送。我用的2.4.1版本比较老,可以下载最新版自己去编译,如果为了测试可以去ulua.org去下载测试。http://www.ulua.org/download.html
下载地址为:
protobuf-2.4.1.zip (d:/protobuf-2.4.1)
protoc-gen-lua.zip (d:/protoc-gen-lua)
请按照给定的路径放置,然后启动一个命令行到D:\protobuf-2.4.1\python 目录下,(确保已安装python 2.7.3,并且bin目录添加到环境变量path中)输入下面命令:
python setup.py build
python setup.py install
编译
修改uLua/Editor/Packager.cs里面BuildProtobufFile函数,即可以编译。
[MenuItem("LuaFramework/Build Protobuf-lua-gen File")]
public static void BuildProtobufFile() {
string dir = AppDataPath + "/LuaFramework/Lua/3rd/pblua";
paths.Clear(); files.Clear(); Recursive(dir);
string protoc = "d:/protobuf-2.4.1/src/protoc.exe";
string protoc_gen_dir = "\"d:/protoc-gen-lua/plugin/protoc-gen-lua.bat\"";
foreach (string f in files) {
string name = Path.GetFileName(f);
string ext = Path.GetExtension(f);
if (!ext.Equals(".proto")) continue;
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = protoc;
info.Arguments = " --lua_out=./ --plugin=protoc-gen-lua=" + protoc_gen_dir + " " + name;
info.WindowStyle = ProcessWindowStyle.Hidden;
info.UseShellExecute = true;
info.WorkingDirectory = dir;
info.ErrorDialog = true;
Util.Log(info.FileName + " " + info.Arguments);
Process pro = Process.Start(info);
pro.WaitForExit();
}
AssetDatabase.Refresh();
}
测试发送pblua:
function PromptCtrl.TestSendPblua()
local login = login_pb.LoginRequest();
login.id = 2000;
login.name = 'game';
login.email = '[email protected]';
local pbs= login:SerializeToString();
----------------------------------------------------------------
local buffer = ByteBuffer.New();
buffer:WriteByte(Protocal.Login);
buffer:WriteBuffer(pbs);
NetManager:SendMessage(buffer);
end
测试解析pblua:
function Network.TestLoginPblua(buffer)
local protocal = buffer:ReadByte();
local data = buffer:ReadBuffer();
local pbs= login_pb.LoginResponse();
pbs:ParseFromString(data);
log('TestLoginPblua: protocal:>'..protocal..' pbs:>'..pbs.id);
end