title: unity-tolua集成pb3支持
categories: Unity3d
tags: [unity, pb3, tolua]
date: 2021-11-18 10:45:39
comments: false
mathjax: true
toc: true

unity-tolua集成pb3支持


前篇

  • tolua_runtime 编译 - https://zhuanlan.zhihu.com/p/81935911
  • tolua中使用protobuf3—集成lua-protobuf
  • tolua#各个平台添加自定义扩展并编译tolua库 - https://www.codeleading.com/article/99421036965/
  • tolua中使用protobuf3—集成lua-protobuf

使用了 lua-protobuf, 那么 protoc-gen-lua 将不能使用.

  • lua-protobuf 使用的是 protoc 3.x 版本去生成 proto 语义文件

  • 网上流行导表工具 xls_deploy_tool.py 也不能使用, 因为这个使用的 python 2.x, protoc 2.x 版本去生成的

    但是只要修改一下这个工具即可 修改导表工具, 使用 python 3.x, protoc 3.x 去生成 数据二进制 和 proto 语义二进制.

    这样项目就可以完全丢弃 python 2.x, protoc 2.x


集成到 tolua 框架中

  • lua-protobuf - https://github.com/starwing/lua-protobuf
  • tolua_runtime - https://github.com/topameng/tolua_runtime
  • tolua编译集成lua-protobuf指南 (好文) - https://john.js.org/2020/11/02/ToLua-Compile-With-lua-protobuf/
    • https://github.com/jozhn/tolua_runtime_pb

源码修改

  1. 把 lua-protobuf 的 pb.cpb.h 文件复制到 tolua_runtime 文件夹中

  2. pb.cluaL_newlib 为 lua5.2 版本才支持的语法,而 tolua 是 5.1,所以找到以下几个函数进行如下修改,判断 Lua 版本进行不同的调用:

    LUALIB_API int luaopen_pb_io(lua_State *L)
    {//...luaL_register(L, "pb.io", libs);luaL_newlib(L, libs);return 1;
    }LUALIB_API int luaopen_pb_conv(lua_State *L)
    {//...luaL_register(L, "pb.io", libs);luaL_newlib(L, libs);return 1;
    }LUALIB_API int luaopen_pb(lua_State *L)
    {//...luaL_register(L, "pb", libs);luaL_newlib(L, libs);return 1;
    }
    

平台编译

Windows
  • 32位编译

    进入 msys2文件夹,打开mingw32.exe。cd 进入到 tolua 代码所在的文件夹(我的在D盘):

    $ cd d:
    $ cd WorkSpace/tolua_runtime
    $ ./build_win32.sh
    

    然后在 Plugins\x86 目录下看见 tolua.dll 文件便编译成功

  • 64位编译

    跟上面一样,只不过是打开mingw64.exe执行相同操作,执行的脚本改成:

    $ ./build_win64.sh
    

    然后在 Plugins\x86_64 目录下看见 tolua.dll 文件便编译成功


Android
  • 要先准备NDK10环境 https://dl.google.com/android/repository/android-ndk-r10e-windows-x86_64.zip
    下载完成后解压到不包含中文和空格的目录下
  • 将 build_arm.sh , build_x86.sh , build_arm64.sh .文件中的 NDK 路径改为自己本地存储的路径
  • 我的是D:/android-ndk-r10e
  • 将 link_arm64.bat 文件中的 ndkPath 修改为上面的NDK解压路径下。只需要修改上面文件中的根路径。不要修改 NDK 的版本

android平台用得最多的cpu架构体系是Acorn公司的arm和Intel公司x86,由于arm市场占有率最高,大多android的app也就只编译了arm版本,所以Intel也专门针对arm体系架构做了一个转换程序,也就是说,arm程序在x86机子上也可以跑起来。所以,一般来说,只要编译arm就可以了(最常用的CPU和ABI是ARMv7a),当然,将x86也编译起来是极好的,据以往分析闪退的经验,在x86机子上闪退的一大元凶就是那个转换程序出了问题,代价就是会增加包体的大小(每多支持一个CPU架构,就是多编译一个动态库so)。

注意:经过测试,NDK版本必须是 android-ndk-r10e 才可以编译,更新的版本生成文件的位置不一样,编译脚本会失效。

  1. armeabi-v7a

    1. 提前需要保证当前目录下存在 Plugins\Android\libs\armeabi-v7a 目录,不然没有文件输出
    2. msys232位编译环境中执行 ./build_arm.sh.
    3. 然后在 Plugins\Android\libs\armeabi-v7a 目录下看见 libtolua.so 文件便编译成功
  2. arm64-v8a

    1. 提前需要保证当前目录下存在 Plugins\Android\libs\arm64-v8a 目录,不然没有文件输出
    2. msys264位编译环境中执行 ./build_arm64.sh.
    3. 然后在 Plugins\Android\libs\arm64-v8a 目录下看见 libtolua.so 文件便编译成功

iOS

必须在Mac机器上编译

环境:macOS Mojav 10.14.5,Xcode 9.4.1

arm64 : 必选项,支持iphone5s及以上;最低支持版本:iOS5.1.1
armv7s:支持iPhone5及以上
armv7:支持iPhone4及以上

我把 build_ios.sh中的armv7和armv7s那段指令删除了,没必要支持那么低的iPhone版本。

  1. 打开终端.切换到 tolua_runtime 目录下
  2. 在终端中运行 build_ios.sh .如果遇见权限不足,用chmod +x命令提升权限
  3. 然后在 Plugins\iOS 目录下看见 libtolua.a 文件便编译成功

Mac

必须在Mac机器上编译

  1. 打开终端.切换到 tolua_runtime 目录下
  2. 在终端中运行 build_osx.sh .如果遇见权限不足,用chmod +x命令提升权限
  3. 然后在 Plugins 目录下看见 tolua.bundle 库文件便编译成功

lua-protobuf 注册

有几种方式

csharp 中注册 pb 全局变量 (建议)
  1. LuaDLL.cs 中增加几个 pb 注册函数

    public class LuaDLL
    {public static string version = "1.0.7.386";// 加入 [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]public static extern int luaopen_pb(IntPtr L);[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]public static extern int luaopen_pb_io(IntPtr L);[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]public static extern int luaopen_pb_conv(IntPtr L);[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]public static extern int luaopen_pb_buffer(IntPtr L);[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]public static extern int luaopen_pb_slice(IntPtr L);...
    }
    
  2. LuaClient 中注册 pb 全局变量

    public class LuaClient
    {protected virtual void OpenLibs(){// lua-protobufluaState.OpenLibs(LuaDLL.luaopen_pb);luaState.OpenLibs(LuaDLL.luaopen_pb_io);luaState.OpenLibs(LuaDLL.luaopen_pb_conv);luaState.OpenLibs(LuaDLL.luaopen_pb_buffer);luaState.OpenLibs(LuaDLL.luaopen_pb_slice);}
    }
    
  3. 然后就可以在 lua 中直接使用 pb 全局变量, 不需要 require

    -- local pb = require "pb"
    local newData = pb.decode("csproto.Person", bytes)

lua 中 require 注册
  1. 在 lua 中 require 注册

    local pb = require "pb"
    local newData = pb.decode("csproto.Person", bytes)
    
    • 因为在 lua 中 require 一个 xxx 库时, 会调用动态库的 c 函数: luaopen_xxx, 里面会完成 pb 的全局变量注册

      LUALIB_API int luaopen_pb(lua_State *L) {...
      #if LUA_VERSION_NUM < 502luaL_register(L, "pb", libs);
      #elseluaL_newlib(L, libs);
      #endifreturn 1;
      }

lua 中使用

local function testPb3Decode()gLog("--- testPb3Decode")local pb     = require "pb"-- load stringlocal protoc = require "3rd.lua-protobuf.protoc" -- protoc 是 https://github.com/starwing/lua-protobuf 提供的工具protoc.include_imports = trueassert(protoc:load [[syntax = "proto3";package csproto;enum Color {Red = 1;Green = 2;Blue = 3;}message Phone {string name = 1;int64 phonenumber = 2;}message Person {string name = 1;int32 age = 2;string address = 3;repeated Phone contacts = 4;}]])local em01 = pb.enum("csproto.Color", "Blue")local em02 = pb.enum("csproto.Color", 1)gLog("--- pb enum, em01: {0}, type: {1}", em01, type(em01)) --> 2, numbergLog("--- pb enum, em02: {0}, type: {1}", em02, type(em02)) --> "Green", string-- lua 表数据local data = {name = "ilse",age  = 18,address = "zhongguo",contacts = {{ name = "alice", phonenumber = 12312341234 },{ name = "bob",   phonenumber = 45645674567 }},act01 = {Speed = 666,Msg = "nice~",},}-- 将Lua表编码为二进制数据local bytes = pb.encode("csproto.Person", data)-- 再解码回Lua表local newData = pb.decode("csproto.Person", bytes)dump(newData, "--- newData")gLog("--- num: {0}", type(newData.contacts[1].phonenumber))
end

windows 平台编译环境 - msys2

  • win10系统64位安装msys2最新版 - https://www.cnblogs.com/CodeWorkerLiMing/p/12274583.html
  • tolua_runtime 配置mingw - https://github.com/topameng/tolua_runtime/wiki
  • msys2安装gcc、g++编译器 - https://blog.csdn.net/Lazybones_3/article/details/88633738
  1. 配置源.

    MSYS2 镜像使用帮助 - https://mirrors.tuna.tsinghua.edu.cn/help/msys2/ , 使用清华源速度会快点

  2. 安装软件包

    1. 启动 msys2.exe, 输入命令

      $ pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime
      

      安装好运行环境之后要把 msys2 的控制台关掉,进到 msys2 的文件夹中运行 autorebase.bat

      为什么要这样做?因为如果不rebase的话 msys2 就没法更新其他软件包,这是 msys2 的问题。

    2. 启动 msys2.exe, 先更新软件包数据库和系统包:

      $ pacman -Syu
      
    3. 安装需要的组件

      $ pacman -S mingw-w64-i686-gcc
      $ pacman -S mingw-w64-x86_64-gcc
      $ pacman -S mingw-w64-i686-make
      $ pacman -S mingw-w64-x86_64-make
      $ pacman -S make
      
      • 如果提示什么PGP签名失效,那么需要更新已知密钥:

        $ pacman-key --refresh-keys
        
  3. done. 然后就可以去编译 tolua_runtime

    比如编译 x86_64, 启动 mingw64.exe

    $ cd /e/workspace/cpp/lua-pb3/tolua_runtime/
    $ ./build_win64.sh
    

    编译成功后就会出现在 tolua_runtime\window\x86_64 目录下


修改导表工具

  • 可以参考我这篇文章: go-excel转protobuf

unity-tolua集成pb3支持相关推荐

  1. 基于shiro的改造集成真正支持restful请求

    基于shiro的改造集成真正支持restful请求 这个模块分离至项目[api权限管理系统与前后端分离实践]api权限管理系统与前后端分离实践,感觉那样太长了找不到重点,分离出来要好点. 首先说明设计 ...

  2. Unity tolua问题记录

    文章目录 1.导入包后类名有与原文件重复的怎么办? 2.Scene 'LuaUIScene' couldn't be loaded because it has not been added to t ...

  3. Unity发布Web之支持手机端

    Unity发布Web之支持手机端 需求: ___ 相信有许多人和小黑一样,会遇到各种各样的难题,这其中就有,Unity发布Web后,在手机浏览器上可运行!!!!! 分析: 为什么会有相关的需求被提出呢 ...

  4. SAP Cloud for Customer里新的Lead UI对Mashup集成的支持原理

    我们在SAP Cloud for Customer UI里可以看见Lead和SalesLead两个UI,其中后者被SAP标记为deprecated状态: Leads才是SAP推荐使用的UI,Lead ...

  5. tolua打包Android后路径出错,unity+tolua 64位android崩溃排查过程记录

    最近项目上线googleplay,需要打64位包,由于unity l2cpp打包比mono慢很多,因此前期开发过程中都是用的mono打的32位包进行测试.结果64位包出来后发生各种莫名其妙的卡死,尤其 ...

  6. Unity ToLua 中Update的调用流程

    1.首先注册Lua中的update函数 LuaState.cs 其中的OpenBaseLuaLibs() public void Start(){ #if UNITY_EDITORbeStart = ...

  7. Unity toLua加载lua的流程

    1.Unity加载Lua文件的流程 Unity中我们要加载Lua文件调用的函数是:LuaState类中的DoFile("xxx").我们可以看到流程是: LuaState:DoFi ...

  8. Unity对于手柄的支持

    今天来谈谈关于Unity手柄的支持 一.首先我们先要搞清楚从哪开始进行控制: 二.接着来看看它里面的属性: Name:[按键名]该键的名称,可以在脚本编程中直接引用他.比如:Input.GetButt ...

  9. Unity百度地图,支持PC,Android,iOS,支持添加模型,支持卫星图,街道图

    目前国内支持Unity的地图只有腾讯地图,但是腾讯地图只有两个月的试用时间,而且相对百度地图,腾讯地图确实有点拉跨,无奈只能自己写地图了 地图纯C#编写无需其他SDK,地图原理基于墨卡托坐标,每个经纬 ...

最新文章

  1. 第三章 用检验控件执行表单的验证
  2. socket编程报异常java.io.EOFException
  3. python3生成随机数_Python3.3中如何产生伪随机数
  4. eclipse新发现功能之dos和terminal(ssh连接)
  5. Java JVM 汇编代码入门 GitChat链接
  6. 蛋白结构建模与优化_最终幻想: 无中生有的蛋白质从头设计
  7. Cordova--打包问题
  8. 云服务器obs_从零搭建流媒体服务器+obs推流直播
  9. 如何下载Eclipse?
  10. 第二人生的源码分析(四十)创建多个工作线程
  11. JMeter之Ramp-up Period(in seconds)说明
  12. 网络中的模块化和社区结构(Modularity and community structure in networks)
  13. 分享精美电脑主题壁纸09-01整理更新分享!
  14. rhel6.2安装oracle11g,RHEL 6.2 64位安装ORACLE 11G R2
  15. matlab曲线绘制——初学者入门
  16. 友盟推送 java_java 后台调用友盟推送 如何设置ios 的 title?
  17. python爬虫学习之爬取全国各省市县级城市邮政编码
  18. 文件加密精灵系统 助你快捷加密解密文件及文件夹
  19. PotPlayer技巧总结
  20. 【深度学习】Deep Learning必备之必背十大网络结构

热门文章

  1. VTK 多平面重建(MPR)及三维切片显示
  2. 基于MATLAB的车牌识别系统设计(Matlab代码实现)
  3. sqli-labs--23-37关通关指南(详细)
  4. GDMSS.LITE
  5. [转] 汉字字符编码的科普笔记
  6. 省市联动与Bootstrap的基本使用
  7. rp虚拟服务器,怀旧服之见闻——RP服务器的戏精玩法
  8. RS232与单端传输、差分传输
  9. juniper SSG 导出导入配置
  10. 微软抵御至今最强DDoS攻击、美国联合30余个国家打击全球勒索组织|10月14日全球网络安全热点