关于腾讯为unity3d提供的lua方案xlua的功能和作用我就不再赘述,官方GitHub上有介绍。自己查看。
官方文档中也有关于xlua集成第三方lua库的流程介绍。不过是在Windows上的操作的。这里说一下在苹果mac上面的流程。
电脑系统和配置:macOS Ventura 13.1,Apple M1 Max芯片。
下面是操作流程:
开发前的准备工作
准备工作一
- mac电脑安装对应最新版本的xcode,钩上命令行工具。cmake macso和ISO需要用到。
- 安装unity2021,安装时需钩上macOS、iOS和Android的组件,也可后续在官网下载对应平台组件安装。新建测试工程。
- 下载xlua https://github.com/Tencent/xLua
- 下载xlua常用的第三方库(包含有常用的rapidjson,protobuf等)https://github.com/91Act/build_xlua_with_libs
准备工作二
- 在mac上安装软件包管理器brew
安装brew方法1:在termnial终端中输入以下命令(网络超时失败时可尝试开vpn)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
方法2:在termnial终端中输入以下命令,按回车后,根据提示操作:输入镜像序号 --> 输入Y,回车等待brew安装完成即可。如果出现网络下载错误,可以重新开始,切换其他镜像尝试。
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
- mac电脑配置cmake编译环境
使用 brew install cmake
安装 cmake,提示安装成功后,重启终端,输入 cmake --version命令查看是否安装成功。成功则会显示cmake当前版本号。
- mac电脑配置android ndk 编译环境,cmake Android时需要用到。
在安装完unity后(需带上Android平台),新建工程,打开工程。在preferences窗口下external tools分页下可以看到unity已配置好的安卓sdk,ndk等路径,复用这个路径下的ndk即可。也可以自行下载ndk,使用对应路径。
终端输入命令cd到系统ect目录下,输入命令open ~/.zshrc
打开zshrc文件编辑命令行环境变量。新版的命令行,macos已经转用zshrc,老的是在bash_profile添加。
添加export ANDROID_NDK=/Applications/Unity/Hub/Editor/2021.3.15f1c1/PlaybackEngines/AndroidPlayer/NDK
- mac电脑配置xcode命令行环境,cmake macos和iOS需要用到。
1、启动终端,输入命令:xcode-select --install,然后一路点击安装
2、安装成功后,输入命令:gcc -v 来查看是否成功
进入开发阶段
将下载的build_xlua_with_libs-master文件夹中build文件下的lua-rapidjson文件夹复制到下载的xLua-master文件夹中build文件夹中。
在CMakeLists.txt加入扩展
xLua的各平台Plugins编译使用cmake编译,好处是所有平台的编译都写在一个makefile,大部分编译处理逻辑是跨平台的。
xLua配套的CMakeLists.txt为第三方扩展提供了扩展点(都是list):
THIRDPART_INC:第三方扩展的头文件搜索路径。
THIRDPART_SRC:第三方扩展的源代码。
THIRDPART_LIB:第三方扩展依赖的库。
用文本编辑器打开cmakelists.txt文件,加入以下修改:
#begin lua-rapidjson
set (RAPIDJSON_SRC lua-rapidjson/source/rapidjson.cpp)
set_property(
SOURCE ${RAPIDJSON_SRC}
APPEND
PROPERTY COMPILE_DEFINITIONS
LUA_LIB
)
list(APPEND THIRDPART_INC lua-rapidjson/include)
set (THIRDPART_SRC ${THIRDPART_SRC} ${RAPIDJSON_SRC})
#end lua-rapidjson
各平台编译
所有编译脚本都是按这个方式命名:make_平台_lua版本.后缀。
将对应平台的编译脚本拉入终端执行,或者终端cd到对应目录执行。
执行完编译脚本会自动拷贝到plugin_lua53或者plugin_luajit目录,前者是lua53版本放置路径,后者是luajit。
根据xlua集成到unity中的流程,将新编译的平台文件复制到unity中。注意复制完成后,需要重启下unity工程。
C#侧集成
所有lua的C扩展库都会提供个luaopen_xxx的函数,xxx是动态库的名字,比如lua-rapidjson库该函数是luaopen_rapidjson,这类函数由lua虚拟机在加载动态库时自动调用,而在手机平台,由于ios的限制我们加载不了动态库,而是直接编译进进程里头。为此,XLua提供了一个API来替代这功能(LuaEnv的成员方法):
public void AddBuildin(string name, LuaCSFunction initer)
name:buildin模块的名字,require时输入的参数;
initer:初始化函数,原型是这样的public delegate int lua_CSFunction(IntPtr L),必须是静态函数,而且带MonoPInvokeCallbackAttribute属性修饰,这个api会检查这两个条件。
扩展LuaDLL.Lua类,用pinvoke把luaopen_rapidjson导出到C#,然后写一个符合lua_CSFunction定义的静态函数。
namespace LuaDLL
{
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);
}
}
}
然后调用AddBuildin:完成注册
luaenv.AddBuildin("rapidjson", LuaDLL.Lua.LoadRapidJson);
测试
在lua脚本中调用一下测试代码
rapidjson = require "rapidjson"
local data = {name = "test json",age = 10,dd = 111111222222}
local jsonStr = rapidjson.encode(data)
print(jsonStr)
local temp_data = rapidjson.decode(jsonStr)
print(temp_data.name)
运行测试工程
总结
其他lua第三方库的添加也是安这个流程,删除则是反过来的流程。无论是第三方还是自己定义的c代码都能接入到xlua的库中,只要代码在各个平台兼容即可。
mac上可以编译mac os ,ios 和Android平台库。win上可以编译x86平台。