之前學了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