由於很多的因素,項目改用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上有兩個:
發現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:
- protobuf-net.dll 從protobuf-net工具包直接取出,根據不同平臺而不同
- PBMessage.dll 生成的動態鏈接庫
- 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目錄中.