我们接入了XLua,那么Protobuf极大的可能还是要用到的,如何接入进来的,这里简单介绍下。

我们可以在如下地址下载工程:

https://github.com/91Act/build_xlua_with_libs

可以在里面的LisTestProj中找到已经添加了的xlua.dll等库的文件,我们直接拷贝到我们工程中,替换我们原本的xlua.dll这些库,我们可以使用dll查看工具,可以看见此库中已经有一个luaopen_pb这个导出函数,我们需要使用一下。

我们找到XLua的C#工程,在LuaDLL的文件内添加如下2个导出函数的声明:

 [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern int luaopen_pb(IntPtr L);

        [MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
        public static int LoadPb(IntPtr L)
        {
            return luaopen_pb(L);
        }

然后在LueEvn.cs中调用一下:

AddBuildin("pb", LuaAPI.LoadPb); //添加这一行
AddBuildin("CS", StaticLuaCallbacks.LoadCS);

完成这一步,我们就能在我们的lua中间中使用了。

local pb = require "pb"
pb.option("enum_as_value")

Protobuf = {}

function Protobuf.Start()
    CS.ResLoader.Get():LoadTextAsset("Assets/Art/Data/pb/person.pb.bytes",function(aa)
        assert(pb.load(aa.bytes)) --把协load进来,下面就能直接使用

        local msg = {}
        msg.id = 1001
        msg.name ="zhang san"
        msg.email = "777777777@qq.com"

        local bytes = assert(pb.encode("Person",msg))
        print(pb.tohex(bytes))

        local data2 = assert(pb.decode("Person", bytes))
        print(require "serpent".block(data2))
    end)
    
end

pb文件是.proto 通过protoc.exe工具生成的,protoc.exe 可以在下面链接下载

https://github.com/protocolbuffers/protobuf/releases

我这里改成了bytes后缀,是因为我要把pb文件导入assetBundle中。