参考链接:

xLua 官方:
https://hub.fastgit.org/Tencent/xLua.git

xLua 官方集成第三方库:
https://hub.fastgit.org/chexiongsheng/build_xlua_with_libs.git

lua-protobuf:
https://hub.fastgit.org/starwing/lua-protobuf.git

1. 下载
下载 xLua 和 build_xlua_with_libs 两个库

2. 编译
假设已经安装好了
安卓 NDK,cmake,ninja,AndroidSDK,JDK
IOS XCode 最新版

下载完成后把 xLua/build 文件夹里除了 CMakeLists.txt 的所有文件复制到 build_xlua_with_libs/build 覆盖,然后把 xLua 库 CMakeLists.txt 的 if (Using_LUAJIT) 之后的所有内容覆盖掉 build_xlua_with_libs 库 CMakeLists.txt 相应内容

配置好 NDK 环境变量 (NDK 来源是使用的 Unity版本安装路径/PlaybackEngines/AndroidPlayer/NDK)

# 假设 NDK 已经放在了 ~/NDK
export ANDROID_NDK="~/NDK"

然后更新一下

# 使用默认 profile 执行这一行
source ./.bash_profile
# 使用 zsh profle 执行这一行
source ./.zshrc

编辑 make_android_lua53.sh 文件,注释判断 NDK 目录相关代码(用 where $ANDROID_NDK 确保 NDK 放在正确路径,判断代码有问题,不知道为什么)

然后执行

cd build_xlua_with_libs文件夹/build
# lua53 执行下面两行
./make_android_lua53_arm64.sh
./make_ios_lua53.sh
# luajit 执行下面两行
./make_android_luajit_arm64.sh
./make_ios_luajit.sh

编译完成后就得到了 Android 和 ios 的插件了,直接复制到 Unity 项目的Plugins 目录下(和 xLua 官方一致),然后 重新打开 Unity 项目(使新的插件生效)

3. 把库文件加入项目

(下面的两段代码也可以在 build_xlua_with_libs 库的示例代码 LibsTestProj/Assets/Helloworld/Helloword.cs 和 build_xlua_with_libs 库的示例代码 LibsTestProj/Assets/BuildInInit.cs 找到)

在获取 Lua 虚拟机的地方,加入(实际上是添加了四个库)

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

新建C#脚本

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

    public partial class Lua
    {
        [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);
        }

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

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

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

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

        [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);
        }
    }
}

最后 Lua 代码引用 pb 就可以了

-- 加载 pb
local pb = require("pb")

Q.E.D.