xlua使用pbc

之前学了xlua整合proto-gen-lua,由于proto-gen-lua使用的lua5.1,相对于现在的5.3来说改动较大。

有兴趣的可以参考下:https://gitee.com/U3DDevelopment/xlua-framework

今天讲述一下xlua整合pbc的过程:

1.首先是xlua整合pbc编译xlua.dll

pbc的下载地址:https://github.com/cloudwu/pbc

xlua就用官方最新:https://github.com/Tencent/xLua

  • 将pbc整个文件夹复制到xlua\build文件夹下
  • 修改xlua\build\CMakeLists.txt
#begin pbc
set (PBC_SRC 
	pbc/src/alloc.c
	pbc/src/array.c
	pbc/src/array.c
	pbc/src/bootstrap.c
	pbc/src/context.c
	pbc/src/decode.c
	pbc/src/map.c
	pbc/src/pattern.c
	pbc/src/proto.c
	pbc/src/register.c
	pbc/src/rmessage.c
	pbc/src/stringpool.c
	pbc/src/varint.c
	pbc/src/wmessage.c
)

if (USING_LUAJIT)
	list(APPEND PBC_SRC pbc pbc/binding/lua/pbc-lua.c)
else ()
	list(APPEND PBC_SRC pbc pbc/binding/lua53/pbc-lua53.c)
endif ()

set_property(
	SOURCE ${PBC_SRC}
	APPEND
	PROPERTY COMPILE_DEFINITIONS
	LUA_LIB
)
list(APPEND THIRDPART_INC pbc pbc/src)
set (THIRDPART_SRC ${THIRDPART_SRC} ${PBC_SRC})
#end pbc
  • 运行make_win64_lua53.bat执行编译,编译默认的是vs2017。
  • 编译执行完成后,在xlua\plugin_lua53\Plugins\x86_64下生成xlua.dll。
  • 关闭unity,去文件夹中将上述xlua.dll替换Unity中Assets/Plugins/x86_64下的xlua.dll。

2.编译pbc能识别的pb文件

proto转pb工具:http://repo1.maven.org/maven2/com/google/protobuf/protoc/

  • 正常编写xxx.proto文件
  • 新建bat文件,将.proto转为.pb文件,代码如下
for /R %%f in (.\proto\*.proto) do ( 
    protoc.exe --descriptor_set_out=.\pb\%%~nf.pb .\proto\%%~nxf
	)
  • 将.pb文件拷贝的unity工程下面

3.使用PBC

新建关联CS,BuildInit.cs,添加如下代码

namespace XLua.LuaDLL
{
    using System.Runtime.InteropServices;

    public partial class Lua
    {
        //pbc
        [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern int luaopen_protobuf_c(System.IntPtr L);

        [MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
        public static int LoadPBC(System.IntPtr L)
        {
            return luaopen_protobuf_c(L);
        }

    }
}
  • lua的启动脚本添加一句代码
 luaenv.AddBuildin("protobuf.c", XLua.LuaDLL.Lua.LoadPBC);
  • 将pbc工程pbc-master\binding\lua53\protobuf.lua拷贝到unity默认lua目录下。
  • 我的测试工程就将protobuf.lua放在Resources目录下,后缀加上.txt,否则unity不认。
  • 编写测试代码
--加载
pb = require "protobuf"

--method1 本地读取方法1
addr = io.open("Assets/user.pb","rb")
buffer = addr:read "*a"
print(">>>>>>>> "..buffer)
addr:close()
pb.register(buffer)

--method1 本地读取方法2
pb.register_file "Assets/user.pb"

--method3 从AssetBundle中读取
buf = CS.ABLoader.Load()
pb.register(buf)
--新建一个表
local userinfo = {acc = "aaa",
	pwd="123"
	}
--pb赋值加密
code = pb.encode("User",userinfo)
--pb解析
decode = pb.decode("User",code)

print("decode.acc : "..decode.acc)
print("decode.pwd : "..decode.pwd)

测试工程地址

链接:https://pan.baidu.com/s/18tchWaDEHt4DmaoSEZNt7Q 
提取码:rnn6 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值