Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Unity —— protobuf 導excel表格數據

Unity —— protobuf 導excel表格數據

編輯:關於Android編程

前言:

之前使用NPOI插件編寫的導表工具,其實就是直接將數據進行序列化,解析時還需要進行反序列化,步驟比較繁復,最近看到Google的一個開源的項目protobuf,不僅可以用於進行excel表格數據的導出,還能直接用於網絡通信協議的定制。

一、protobuf簡介:

protobuf是由google公司發布的一個開源的項目,是一款方便而又通用的數據傳輸協議。所以我們在Unity中也可以借助protobuf來進行數據存儲網絡協議兩方面的開發,這裡先說說數據存儲部分的操作,也就是:

將.xls表格數據通過protobuf進行序列化,並在Unity中使用。

1.下載資源:

Python2.7 安裝方法:python安裝和配置 protobuf-2.5.0.zip 下載地址:http://pan.baidu.com/s/1kVk5LhP protobuf-net github下載地址:https://github.com/mgravell/protobuf-net

2.流程圖:

\

從上圖可看出基本的操作步驟:

 

.xls表格文件,先通過xls_deploy_tool.py生成對應的.data文件和.proto文件,其中.data文件就是表格數據序列化後的結果,而.proto文件則是用於生成反序列化時使用的解析類的中間狀態; 解析類.proto經過protoc.exe轉換成.desc文件,用於後面通過protobuf-net等工具轉化為特定的語言,這裡我們需要得到的是C#解析類,即.cs類; 在Unity中導入protobuf-net.dll庫,在C#代碼中調用上述生成的.cs解析類來解析.data中的數據。

二、導表環境配置:

1.Python相關配置:

由於從.xls文件生成.data和.proto,Python需要依賴Proto庫和xlrd庫,安裝配置步驟:

 

 

setuptools:這是Python的組件安裝管理器,需要在安裝protobuff組件前進行安裝,到setuptools官網下載插件的安裝包,解壓到指定目錄,然後使用命令行進入安裝包目錄,執行指令:python setup.py install;   Protobuff:首先,我們將之前下載好的源碼包protobuf-2.5.0.zip和編譯包protoc-2.5.0-win32.zip壓縮包解壓到指定目錄,路徑最好不要包含中文;這裡我解壓protobuf-2.5.0.zip到的位置是“E:\Unity_Workplace\protobuf_250”;然後復制protoc-2.5.0-win32.zip解壓得到的protoc.exe到protobuf_250\src目錄下;在protobuf-2.5.0\python\google\protobuf下創建一個文件夾命名為compiler(安裝完成後會在此目錄下生成兩個文件__init__.py和plugin_pb2.py);使用命令行進入到解壓後的目錄下面的Python目錄,執行:python setup.py install;   xlrd(xls reader):這其實是讀取xls表格數據的一個工具插件,到xlrd官網下載xrld的安裝包,解壓安裝包然後使用命令行進入安裝包目錄,執行指令:python setup.py install。

 

2.導表外部工具:

 

xls_deploy_tool.py:這個工具其實是github上的一個開源的符合protobuff標准的根據excel自動生成匹配的PB的定義(.proto文件)並將數據序列化後生成二進制數據或者文本數據(.data文件)的一個工具,github下載地址:xls_deploy_tool.py。   protoc.exe和protogen.exe:通過上面的工具,我們得到了兩個文件:存儲數據的.data文件和用於解析數據的.proto文件,但是我們在真正使用解析類來進行數據文件的解析時,必須是高級語言,當然protobuf-net提供很多種高級語言的支持。就像我們在Unity中我們使用的是C#語言,這需要兩個工具來實現,一個是protobuf-2.5.0中的protoc.exe將.proto文件轉換為“FileDescriptorSet”中間格式;另一個是使用protobuf-net中的protogen.exe,將中間格式的文件轉換為最終狀態,即高級語言的解析類.cs文件。可以到github上下載protobuf-net的源碼:protobuf-net,下載後解壓到本地,然後進入到解壓後protobuf-net-master\protobuf-net目錄下,通過Visual Studio打開protobuf-net.csproj: \ \ 編譯完成後在當前目錄下面的bin\Release目錄下,生成了編譯後的文件,其中我們需要的是protobuf-net.dll: \ 將protobuf-net.dll復制到protobuf-net-master\ProtoGen目錄下,用Visual Studio打開ProtoGen.csproj,參照上面步驟編譯ProtoGen項目,得到protobuf-net-master\ProtoGen\bin\Release目錄下面的protogen.exe及一些額外的文件,但在真正使用時此目錄下面的所有文件都是必須的: \

 

三、樣例:

1.建立表格.xls:

當然使用此工具進行導表的表格需要符合指定的格式,根據xls_deploy_tool.py的備注內容:

 

# 說明:
#   excel 的前四行用於結構定義, 其余則為數據,按第一行區分, 分別解釋:
#       required 必有屬性
#       optional 可選屬性
#           第二行: 屬性類型
#           第三行:屬性名
#           第四行:注釋
#           數據行:屬性值
#       repeated 表明下一個屬性是repeated,即數組
#           第二行: repeat的最大次數, excel中會重復列出該屬性
#           2011-11-29 做了修改 第二行如果是類型定義的話,則表明該列是repeated
#           但是目前只支持整形
#           第三行:無用
#           第四行:注釋
#           數據行:實際的重復次數
#       required_struct 必選結構屬性
#       optional_struct 可選結構屬性
#           第二行:結構元素個數
#           第三行:結構名
#           第四行:在上層結構中的屬性名
#           數據行:不用填

#    1  | required/optional | repeated  | required_struct/optional_struct   |
#       | ------------------| ---------:| ---------------------------------:|
#    2  | 屬性類型          |           | 結構元素個數                      |
#    3  | 屬性名            |           | 結構類型名                        |
#    4  | 注釋說明          |           | 在上層結構中的屬性名              |
#    5  | 屬性值            |           |                                   |

當然可以參考github上下載到的樣例表格,下載tnt項目,然後復制其中python目錄下面的內容,其中xls文件中就有一個goods_info.xls的樣例表格:

\

 

 

2.xls_deploy_tool.py轉換得到.data和.proto:

進行導表的操作只需用在命令行中的一句指令即可完成:

 

python xls_deploy_tool.py sheet_name xls_path

 

其中包含兩個參數:sheet_name是.xls中要進行導表的表格頁名,xls_path是要進行導表的.xls文件的路徑。創建一個測試工程Test_protobuf,將1中的兩個文件和protoc.exe放入其中:

\

在命令行定位到該目錄下,然後運行指令:

 

call python xls_deploy_tool.py GOODS_INFO xls/goods_info.xls
運行結束後,該目錄下多出了幾個文件,但我們真正需要的只有兩個文件,即.data數據文件和.proto解析類:

 

\
\

 

 

3.得到最終解析類:

protoc.exe得到中間格式文件,假設後綴為.protodesc,使用指令:

 

protoc 輸入文件路徑(.proto文件) --descriptor_set_out=輸出文件路徑(.protodesc)

在步驟2中的測試工程基礎上繼續執行指令:

 

protoc tnt_deploy_goods_info.proto --descriptor_set_out=goods_info.protodesc
運行此步之後,在項目中又多出了一個與.proto對應的.protodesc文件:

 

\

protogen.exe得到.cs解析類,使用指令:

 

protogen -i:輸入文件路徑(.protodesc) -o:輸出文件路徑(.cs)

 

將之前生成protogen.exe時protobuf-net-master\ProtoGen\bin\Release目錄下面的所有文件復制到當前工程中,用一個文件夾ProtoGen來存放,假如不想執行這麼繁瑣的過程,也可以直接使用我編譯好的ProtoGen文件目錄壓縮包:ProtoGen.zip,在當前項目的根目錄下執行以下指令:

 

call ProtoGen\protogen -i:goods_info.protodesc -o:goods_info.cs
執行結果,在當前目錄下生成了解析類的最終狀態goods_info.cs:

 

\

當然,以上三步可以直接用批處理來完成,直接在當前項目根目錄下新建一個文件,命名為generator.bat,內容為:

 

call python xls_deploy_tool.py GOODS_INFO xls/goods_info.xls
call protoc tnt_deploy_goods_info.proto --descriptor_set_out=goods_info.protodesc
call ProtoGen\protogen -i:goods_info.protodesc -o:goods_info.cs
pause
直接雙擊此文件即可完成以上所有操作生成最終的.data和.cs文件。

 

\

 

4.Unity導入庫文件:

將幾個文件添加到Unity工程中,將.data文件放在Assets\StreamingAssets\DataConfig目錄下,將protobuf-net.dll和goods_info.cs放在Assets目錄下:

\ \

創建一個Test.cs測試腳本,在腳本中using Protobuf用於導入protobuf-net.dll中的庫,然後使用using tnt_deploy導入導表生成的.cs表格數據解析類,腳本具體代碼內容為:

 

using UnityEngine;
using System.Collections;
using ProtoBuf;
using System.IO;
using tnt_deploy;

public class Test : MonoBehaviour {
	void Start () {
        GOODS_INFO_ARRAY goods_infos = ReadOneDataConfig("goods_info");
        Debug.Log("goods_id==================" + goods_infos.items[0].goods_id);
	}

    private T ReadOneDataConfig(string FileName)
    {
        FileStream fileStream;
        fileStream = GetDataFileStream(FileName);
        if (null != fileStream)
        {
            T t = Serializer.Deserialize(fileStream);
            fileStream.Close();
            return t;
        }

        return default(T);
    }
    private FileStream GetDataFileStream(string fileName)
    {
        string filePath = GetDataConfigPath(fileName);
        if (File.Exists(filePath))
        {
            FileStream fileStream = new FileStream(filePath, FileMode.Open);
            return fileStream;
        }

        return null;
    }
    private string GetDataConfigPath(string fileName)
    {
        return Application.streamingAssetsPath + "/DataConfig/" + fileName + ".data";
    }
}
在Unity中新建一個場景,將Test.cs掛載在Main Camera主相機上,運行場景,看到打印結果,說明解析表格數據成功:

 

\

 

5.平台兼容問題:

由於直接把protobuf-net.dll放到項目中時,在iOS中會出現JIT錯誤(ExecutionEngineException: Attempting to JIT compile method)。原因是因為iOS不允許JIT(Just In Time),只允許AOT(Ahead Of Time)。

解決方法:

直接把protprotobuf-net-master\protobuf-net目錄下面的全部源碼復制到Unity項目的目錄下面,但是由於protobuf-net的編譯過程是unsafe編譯,所以Unity會出現編譯報錯:

\

需要在Assets目錄下添加一個smsc.rsp文件,其內容很簡單,只有一行“-unsafe”,添加完成後關閉Unity然後重新打開Unity,一切就正常了。

四、總結:

雖然導表環境的配置過程比較繁瑣,但是配置完成之後的工作效率卻很高,而且proto具有突出的通用性,可以應用於各種語言環境。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved