上次我们集成编译好了各平台的xlua.
接下来 我们在LuaDll 添加如下代码
[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
public static extern int luaopen_protobuf_c(System.IntPtr L);
[MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
public static int LoadProtobufC(System.IntPtr L)
{
return luaopen_protobuf_c(L);
}
[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
public static extern int luaopen_pb(System.IntPtr L);
[MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
public static int LoadPb(System.IntPtr L)
{
return luaopen_pb(L);
}
然后在LuaDLL 中添加
AddBuildin("pb", XLua.LuaDLL.Lua.LoadPb);
我们把ua-protobuf 目录下的protoc.lua 文件拷贝到我们lua框架下
然后我们创建一个proto3 文件
syntax = "proto3";
message Monster
{
string Name = 1;
int32 level = 2;
string Describe = 3;
}
最后我们编写一些测试lua 文件
local TestPb = class("TestPb");
-- 测试PB的序列化和反序列化
function TestPb:TestPB()
Resource.resourceLoaderManager:LoadMainAsset
(AssetCategory.CusShaders, "Assets/Download/Proto/Monster.proto.txt",function(res)
if(res~=nil)
then
local protoString=res.Target.text;
local protoc = (require("Framework/NetWork/protoc")).new()
--引入PB库
local pb = require "pb"
assert(protoc:load(protoString, "Monster.proto"))
local data =
{
Name = '缝合怪',
level = 100,
Describe = "重型战士,活跃于战场的最前线。缝合怪能用肉勾把敌人拖向他,还能在受伤时释放毒云。",
}
-- 序列化成字节流
local bytes = assert(pb.encode('Monster', data))
print(pb.tohex(bytes));
-- 反序列化成lua的table
local data2 = assert(pb.decode('Monster', bytes))
print(data2.Name)
print(data2.level)
print(data2.Describe)
end
end);
end
return TestPb;
运行效果如下:
xlua 到此就集成测试完毕了,接下来编写一个完善的通信框架