参考链接:
xLua 官方:
https://github.com/Tencent/xLua.git
xLua 官方集成第三方库:
https://github.com/chexiongsheng/build_xlua_with_libs.git
lua-protobuf:
https://github.com/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.