参考资料

xLua官方:https://github.com/Tencent/xLua
xLua集成第三方库官方教程:https://github.com/chexiongsheng/build_xlua_with_libs
lua-protobuf:https://github.com/starwing/lua-protobuf

win环境要求

cmake(需要配置好环境变量)
C/C++编译环境(若vs没有安装好环境,可以在build64目录下,双击Xlua.sln,会提示安装)
第三方扩展的源码,build_xlua_with_libs内已经放好了ffi,lpeg,rapidjson,lua-protobuf,pbc

集成过程

build_xlua_with_libs内的CMakeLists已经配置好了ffi,lpeg,rapidjson,lua-protobuf。且支持pdc。

1,版本同步

为了和xLua版本同步,建议先把https://github.com/Tencent/xLua/tree/master/build下的除CMakeLists.txt之外的文件目录,覆盖到https://github.com/chexiongsheng/build_xlua_with_libs/tree/master/build目录。

2,批处理

使用Windows机器,可以编译Win平台和Android平台的库。

window平台库编译(需要C/C++环境配置好)
双击make_win64_lua53.bat,生成build64目录
用VS2017运行Xlua.sln并生成

macos平台编译
在macos系统上,chmod 777 make_osx_lua53.sh
然后执行 ./make_osx_lua53.sh

ios平台编译
在macos系统上,chmod 777 make_ios_lua53.sh
然后执行 ./make_ios_lua53.sh

android平台编译
在macos系统上,下载ndk,地址如下:http://dl.google.com/android/ndk/android-ndk-r10e-darwin-x86_64.bin
解压bin
编辑make_android_lua53.sh ,修改ANDROID_NDK目录为解压的ndk目录
chmod 777 make_android_lua53.sh
./make_android_lua53.sh

这里以win平台下说明。前提是配置好C/C++环境。
这里稍微修改了make_win64_lua53.bat为下:
mkdir build64 & pushd build64
cmake -G “Visual Studio 15 2017 Win64” …
popd
cmake --build build64 --config Release
md plugin_lua53\Plugins\x86_64
copy /Y build64\Release\xlua.dll plugin_lua53\Plugins\x86_64\xlua.dll
pause

执行上述批处理命令后,在拷贝目标目录plugin_lua53\Plugins\x86_64中的xlua.dll,替换Unity工程中Plugins/x86_64目录中的xlua.dll

安卓平台库编译,参考:
https://blog.csdn.net/yudianxia/article/details/81738699
https://blog.csdn.net/codingriver/article/details/83271053

3,Unity3D侧,XLUA增加对lua-protobuf的支持

1)LuaDLL.cs 大概40行,增加

        //增加lua-protobuf支持
        [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern int luaopen_pb(System.IntPtr L);

        [MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
        public static int LoadLuaProfobuf(System.IntPtr L)
        {
            return luaopen_pb(L);
        }
        //增加rapidjson支持
        //[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
        //public static extern int luaopen_rapidjson(System.IntPtr L);

        //[MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
        //public static int LoadRapidJson(System.IntPtr L)
        //{
        //    return luaopen_rapidjson(L);
        //}
        //增加lpeg支持
        //[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
        //public static extern int luaopen_lpeg(IntPtr luaState);

        //[MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
        //public static int LoadLpeg(System.IntPtr L)
        //{
        //    return luaopen_lpeg(L);
        //}
        //增加ffi支持
        //[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
        //public static extern int luaopen_ffi(System.IntPtr L);

        //[MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
        //public static int LoadFFI(System.IntPtr L)
        //{
        //    return luaopen_ffi(L);
        //}

2)LuaEnv.cs大概120行,在AddBuildin(“CS”,StaticLuaCallbacks.LoadCS);这句前增加:

AddBuildin("pb", XLua.LuaDLL.Lua.LoadLuaProfobuf);
            //AddBuildin("rapidjson", XLua.LuaDLL.Lua.LoadRapidJson);
            //AddBuildin("lpeg", LuaDLL.Lua.LoadLpeg);            
            //AddBuildin("ffi", XLua.LuaDLL.Lua.LoadFFI);

由于项目中其它扩展没有用到,上面代码注释掉。
另外对于上述1),2)部分,也可以不按照上述方式配置,可以把LuaDLL.CS中增加的扩展内容,单独放到一个类中。在luaEnv初始化的时候,调用。
形如:

LuaEnv luaenv = new LuaEnv();
luaenv.AddBuildin("rapidjson", XLua.LuaDLL.Lua.LoadRapidJson);
luaenv.AddBuildin("lpeg", XLua.LuaDLL.Lua.LoadLpeg);
luaenv.AddBuildin("pb", XLua.LuaDLL.Lua.LoadLuaProfobuf);
luaenv.AddBuildin("ffi", XLua.LuaDLL.Lua.LoadFFI);
4,lua侧集成

local pb=require “pb”
local protoc=require “protoc”
protoc:load(proto.Schema)–协议内容注册到lua端,proto.Schema结构形如:[[all-proto-content]]

–编码, msg为lua侧 符合协议结构的table;返回值为userdata
local data=pb.encode(msgName,msg)
–解码, data为pb编码的userdata
local msg=pb.decode(msgName,data)

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐