[Unity热更新]tolua# & LuaFramework(五):.proto转换为.lua

时间:2022-10-30 18:42:25

这次介绍一下在LuaFramework中,将.proto文件转化为.lua文件的步骤


1.Python的下载与安装

下载:https://www.python.org/downloads/   (推荐选择2.x版本)

安装:http://www.runoob.com/python/python-install.html


2.下载protoc-gen-lua.zip并解压到d盘:http://pan.baidu.com/s/1eSyMki2

3.下载protobuf-2.5.0.zip并解压到d盘:http://pan.baidu.com/s/1nuIA1YT

因为框架的关系要放在d盘,当然也可以放在自定义路径,这样就需要修改框架中的源码,默认就好;如果使用的是VS2013,那么推荐protobuf的版本要在2.5.0以上,否则会报很多错误!


4.找到D:\protobuf-2.5.0\vsprojects,然后双击protobuf.sln打开,菜单栏生成/ 生成解决方案,进行编译,期间会报一些错误:

a.min找不到标识符

解决:在错误的文件里加上#include "minmax.h"

b.如果要将多个 CL.EXE 写入同一个 .PDB 文件,请使用 /FS

解决:

打开项目的“属性页”对话框,选择 C/C++ 文件夹,选择“命令行”属性页,修改“其它选项”属性以包括/FS,然后选择“确定”。

[Unity热更新]tolua# & LuaFramework(五):.proto转换为.lua

右击项目 --> "属性”
1. “C/C++” --> "常规” -->”调试信息格式” 设置为 “C7 兼容(/Z7)”
2. “C/C++” --> "代码生成” -->”启用字符串池” 设置为 “是(/GF)”


c.cannot open file ' ?.obj'

解决:把debug目录删掉


那么,如无意外,生成时就不会报错了。


5.

命令行cmd,定位到D:\protobuf-2.5.0\python,然后执行python setup.py build,如果成功的话,就会这样:

[Unity热更新]tolua# & LuaFramework(五):.proto转换为.lua

然后执行python setup.py install,如果成功的话,最后会看到:

[Unity热更新]tolua# & LuaFramework(五):.proto转换为.lua


6.打开unity工程,先把Assets\LuaFramework\Lua\3rd\pblua中的login_pb.lua移动到别的地方,以便观察结果。找到Packager类中的BuildProtobufFile方法,修改一下路径:

    [MenuItem("LuaFramework/Build Protobuf-lua-gen File")]
    public static void BuildProtobufFile()
    {
        if (!AppConst.ExampleMode)
        {
            Debugger.LogError("若使用编码Protobuf-lua-gen功能,需要自己配置外部环境!!");
            return;
        }
        string dir = AppDataPath + "/LuaFramework/Lua/3rd/pblua";
        //UnityEngine.Debug.Log(dir);
        paths.Clear(); files.Clear(); Recursive(dir);

        string protoc = "d:/protobuf-2.5.0/src/protoc.exe";
        string protoc_gen_dir = "\"d:/protoc-gen-lua/plugin/protoc-gen-lua.bat\"";

        foreach (string f in files)
        {
            string name = Path.GetFileName(f);
            string ext = Path.GetExtension(f);
            //UnityEngine.Debug.Log(name + "   " + ext);
            if (!ext.Equals(".proto")) continue;

            ProcessStartInfo info = new ProcessStartInfo();
            info.FileName = protoc;
            info.Arguments = " --lua_out=./ --plugin=protoc-gen-lua=" + protoc_gen_dir + " " + name;
            info.WindowStyle = ProcessWindowStyle.Hidden;
            info.UseShellExecute = true;
            info.WorkingDirectory = dir;
            info.ErrorDialog = true;
            Util.Log(info.FileName + " " + info.Arguments);

            Process pro = Process.Start(info);
            pro.WaitForExit();
        }
        AssetDatabase.Refresh();
    }


关于Process & ProcessStartInfo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace TestProcess
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用IE浏览器打开百度
            Process process = new Process();
            process.StartInfo.FileName = "iexplore.exe";
            process.StartInfo.Arguments = "http://www.baidu.com";
            process.Start();

            //打开D盘
            ProcessStartInfo processStartInfo = new ProcessStartInfo("");
            processStartInfo.FileName = "explorer.exe";
            processStartInfo.Arguments = @"D:\";
            Process.Start(processStartInfo);

            //string fileName
            Process.Start(@"D:\Program Files\QQ\Bin\QQ.exe");
            //string fileName, string arguments
            Process.Start("explorer.exe", @"D:\Program Files\QQ\gf-config.xml");
        }
    }
}


点击菜单栏LuaFramework/Build Protobuf-lua-gen File,如无意外,应该会看到:

[Unity热更新]tolua# & LuaFramework(五):.proto转换为.lua

那么把D:\protobuf-2.5.0\vsprojects\Debug中的protoc.exe复制过去即可,再次点击,就会看到Assets\LuaFramework\Lua\3rd\pblua多了一个login_pb.lua,而且跟框架之前那个是一样的!上面的代码中,info.Arguments = " --lua_out=./,意思就是将生成的.lua放到当前目录,而这个当前目录,是根据info.WorkingDirectory而定的。


这个环境搭建花了我一天的时间了,弄得身心疲惫,果然是一个体力活啊!不过总算成功了,付出的没有白费!此时的我,高兴得手舞足蹈啊!