在Unity5中使用Protobuf

由於很多的因素,項目改用U3D開發,而項目組目前爲止沒資深的Unity開發程序員,只能摸着石頭過河了.我們網絡通信數據使用protobuf的格式,(關於這protobuf的格式分析在上一篇筆記中已經分析得很詳細了).簡單說明一下目前項目的開發環境與插件的使用情況:

開發腳本: C# (.Net 2.0) 由於我與另一位同事均無C#功底,所以業餘時間學習C#必不可少,本人而言已經有了基本的計劃.(爲什麼不是JS 或者BOO,詳細翻了一下Assets Unity 基本上大多插件都是用C#寫的,Boo更加是第一次聽)

開發工具:拋棄官方的Mono 使用VS2012,主要使用了UnityVS插件,注意這個插件現在已經免費了.傳送門

GUI:有UGUI與NGUI和GUI三個選擇,目前選的是NGUI,主要原因是NGUI的教材網上一抓一大把,由於換引擎的突發性,已經沒太多時間給我去看那個比較好用了.(很多事情總是充滿無奈)

網絡模塊:Unity5 提供了一套Net組件,在我花了兩天時間去看了它的幾個組件之後,發現根本不足以滿足我們項目的要求.所以決定使用.Net自帶的Socket自己實現.(約莫花了三天的時間)

protobuf的使用

目前C#的庫 在google code上有兩個:

  1. protobuf-net
  2. protobuf-csharp-port

發現protobuf-net對跨平臺的支持似乎略優於protobuf-csharp-port,在社區的評價也好一點,所以選用了protobuf-net.使用protobuf-net基本的步驟是:

  • 編寫proto文件

舉個梨子,保存爲demo.proto,message語法請自行學習

/*
 * package demo;  
 *
 * message People {  
 *    required string name = 1;  
 *    required int32 id = 2;  
 *    required string email = 3;  
 * }
 */
  • 使用protogen.exe生成C#源碼文件

基本語法爲

// -i: 指定proto文件 可以指定多個
// -o: 制定輸出文件路徑與文件名
// -ns: 指定源碼命名空間,如果不設置則默認爲proto的文件名爲命名空間
// 若proto文件中有package XXX 參數,則強制命名空間名字爲 XXX
protobuf-net\ProtoGen\protogen.exe -i:demo.proto -o:PBMessage\PBMessage.cs -ns:PBMessage
  • 源文件生成DLL動態鏈接庫

基本命令爲:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig /nowarn:1701,1702 /nostdlib+ /
errorreport:prompt /warn:4 /define:TRACE /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll /
reference:protobuf-net.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll /debug:pdbonly /
filealign:512 /optimize+ /out:obj\Release\PBMessage.dll /target:library /utf8output PBMessage.cs Properties\AssemblyInfo.cs

如果不想用命令行解決,也可以直接使用VS創建C#庫項目,然後把源文件加到項目裏,F5生成.在這一步中 得到PBMessage.dll(dll文件名可隨意更改)AssemblyInfo.cs爲版本信息文件,可在本文末的下載文件中找到,也可以自行創建一個

  • 預編譯序列化庫 需要上一步得到的PBMessage.dll

命令如下:

protobuf-net\Precompile\precompile.exe PBMessage.dll -o:PBMessageSerializer.dll -t:PBMessageSerializer

經過前面的步驟之後,我們得到了三個DLL:

  1. protobuf-net.dll 從protobuf-net工具包直接取出,根據不同平臺而不同
  2. PBMessage.dll 生成的動態鏈接庫
  3. PBMessageSerializer.dll 預編譯序列化庫

把這三個庫放到 Unity項目的 Assets\Plugins\protobuf文件夾下,如沒這個文件夾則自行創建.到此就完成了全部配置工作,接下來是代碼使用.方法如下:

/*
 * package demo;  
 *
 * message People {  
 *    required string name = 1;  
 *    required int32 id = 2;  
 *    required string email = 3;  
 * }
 */
public void WriteProtoBuf()
{
    demo.People proto = new demo.People();
    proto.email = "[email protected]";
    proto.id = 10086;
    proto.name = "Rect";

    // 序列化
    using (MemoryStream ms = new MemoryStream())
    {
        new PBMessageSerializer().Serialize(ms, proto);
        Byte[] pBuffer = ms.ToArray();
    }
}
public void ReadProtoBuf(Byte[] pBuffer,int nSize)
{
    if (null == pBuffer || 0 >= nSize)
    {
        return;
    }
    // 反序列化
    using (MemoryStream ms = new MemoryStream(pBuffer, 0, nSize))
    {
        demo.People proto =  new PBMessageSerializer().Deserialize(ms, null, typeof(demo.People)) as demo.People;
    }
}

代碼非常簡單.

整個過程被我整合成一個Bat命令:傳送門,只需要把proto文件放到根目錄,然後運行Build.bat批處理即可.最後的生成DLL在Bin目錄中.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章