Unity中使用ProtoBuff3.0儡嘶,與netty服務器通信的粘包喇聊、拆包處理(一)

[TOC]

1. Unity protobuff3.0庫的選擇

網上搜查發(fā)現(xiàn),目前可供unity使用的protobuff3.0的庫主要有2個蹦狂,一個是
protobuf-net誓篱,另一個是
protobuf3-for-unity,選擇哪一個呢凯楔?

  • 從github上的Star數(shù)量來看:protobuf-net的1400+遠勝于protobuf3-for-unity的136
  • 從更新日期來看窜骄,protobuf-net最近幾天都有post,而protobuf3-for-unity最近的動作則是在十個月之前了啼辣。

但是為什么最終選擇了protobuf3-for-unity?因為我使用Nuget :

Install-Package protobuf-net

安裝protobuf-net一直不成功御滩,報錯說指令集不兼容鸥拧,我們知道党远,unity支持的.net版本是2.0和3.5,protobuf-net最新支持的是.NET Framework 4.0+的富弦,沒法用沟娱,官網上說v2.1.0的版本支持.NET Framework 2.0/3.0/3.5,于是安裝命令改成:

Install-Package protobuf-net -version 2.1.0

還是報一樣的錯誤:

Install-Package protobuf-net

正在嘗試收集與目標為“.NETFramework,Version=v3.5,Profile=Unity Subset v3.5”的項目“TestMj”有關的>包“protobuf-net.2.2.1”的依賴項信息
收集依賴項信息花費時間 1.11 ms
正在嘗試解析程序包“protobuf-net.2.2.1”的依賴項腕柜,DependencyBehavior 為“Lowest”
解析依賴項信息花費時間 0 ms
正在解析操作以安裝程序包“protobuf-net.2.2.1”
已解析操作以安裝程序包“protobuf-net.2.2.1”
從“nuget.org”檢索包“protobuf-net 2.2.1”
GET https://api.nuget.org/packages/protobuf-net.2.2.1.nupkg
OK https://api.nuget.org/packages/protobuf-net.2.2.1.nupkg 69 毫秒
正在安裝 protobuf-net 2.2.1济似。
安裝失敗。正在回滾...
程序包“protobuf-net.2.2.1”不存在于項目“TestMj”中
程序包“protobuf-net.2.2.1”不存在于文件夾“C:\Users\IGG\AppData\Local\Temp\TestMj\packages”中
執(zhí)行 nuget 操作花費時間 701.07 ms
Install-Package : 無法安裝程序包“protobuf-net 2.2.1”盏缤。你正在嘗試將此程序包安裝到目標為“.NETFramework,Version=v3.5,Profile=Unity Subset v3.5”的項目中砰蠢,但該程序包不包含任何與該框架兼容的程序集引用或內容文件。有關詳細信息唉铜,請聯(lián)系程序包作者台舱。
所在位置 行:1 字符: 16

  • Install-Package <<<< protobuf-net
    • CategoryInfo : NotSpecified: (:) [Install-Package], Exception
    • FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PackageManagement.PowerShellCmdlets.InstallPackageCommand

已用時間: 00:00:01.6763018

參考這個最新版的release note里面,好像是有針對這個問題做修復潭流,但是我試了Install-Package protobuf-net -version 2.3.0-alpha沒效果竞惋,不知道是不是用法不對,不想繼續(xù)浪費時間灰嫉,就果斷選擇protobuf3-for-unity拆宛。等下次閑了再去試試。

v2.3.0-alpha

  • net20 / net35 targets reinstated for NuGet build (#262)

2. Unity protobuff3.0整合及測試

整合:

  1. 新建一個unity3d項目
  2. 下載protobuf3-for-unity讼撒,解壓浑厚。
  3. 根據項目首頁readme.md的指示,安裝對應版本的.NET Core
  4. 雙擊解壓后的得到的build_packages.bat椿肩,進行編譯瞻颂,如果編譯失敗,一定是.Net Core版本選擇錯了郑象,卸載掉原來的重新下載一個安裝再試贡这。
  5. 編譯成功的話,protobuf3-for-unity-3.0.0\src\Google.Protobuf\bin\Release\net35目錄下會有一個Google.Protobuf.dll厂榛,這個dll就是我們要用在unity項目里面的盖矫。如果自己編譯不出來,也可以在這里直接下載击奶,解壓里面就有一個作者編好的dll辈双。
  6. 把上面的dll拷貝到unity項目的Assets\Plugins\目錄下。如果沒有Plugins目錄柜砾,自己創(chuàng)建一個湃望。

注:protobuf3-for-unity-3.0.0\src\Google.Protobuf工程源碼可以看看,有助于了解protobuff3.0的實現(xiàn)。

測試:

  • 在測試之前证芭,還需要下載一個protoc瞳浦,也就是代碼生成器,用來把我們定義的proto文件生成C#對應的類废士,我們是protobuff3.0版本叫潦,要選對版本、選對系統(tǒng)官硝,我是win7系統(tǒng)矗蕊,所以是下載這個protoc-3.0.0-win32.zip,注意需要的是protoc氢架,不需要把源代碼下載下來傻咖。源代碼在上面下載的protobuf3-for-unity里面已經有了。解壓后在protoc-3.0.0-win32\bin目錄下能看到一個protoc.exe
  • 把下面代碼保存成addressbook.proto文件放在protoc.exe同級目錄下
syntax = "proto3";
package tutorial;

message Person {
  string name = 1;
  int32 id = 2;  // Unique ID number for this person.
  string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }

  repeated PhoneNumber phones = 4;
}

// Our address book file is just one of these.
message AddressBook {
  repeated Person people = 1;
}```
- 打開一個cmd窗口达箍,cd到protoc.exe所在目錄没龙,輸入``` protoc --csharp_out=./ addressbook.proto ```然后回車,可以看到缎玫,同級目錄下生成了一個Addressbook.cs文件硬纤,這個文件需要加在unity3d工程的Assets\Scripts目錄下,不放在Scripts目錄下應該也沒影響赃磨。
- 新建一個C#腳本筝家,掛在場景任意一個物體上,只要啟動的時候能觸發(fā)這個腳本的調用就可以了邻辉。
- 在新建的腳本的Start函數(shù)里寫上測試代碼:

``` C#
// 我的全部using是這些溪王,因為已經添加了網絡部分的,雖然到這一步還沒用到
using Google.Protobuf;
using Google.Protobuf.Examples.AddressBook;
using Google.Protobuf.WellKnownTypes;
using System;
using System.IO;
using System.Net.Sockets;
using UnityEngine;

void Start () {
        // 這些代碼是在protobuf3-for-unity-3.0.0\src\AddressBook\Program.cs里面拷貝的
        byte[] bytes;
        // Create a new person
        Person person = new Person
        {
            Id = 1,
            Name = "Foo",
            Email = "foo@bar",
            Phones = { new Person.Types.PhoneNumber { Number = "555-1212" } }
        };
        using (MemoryStream stream = new MemoryStream())
        {
            // Save the person to a stream
            person.WriteTo(stream);
            bytes = stream.ToArray();
        }
        Person copy = Person.Parser.ParseFrom(bytes);

        AddressBook book = new AddressBook
        {
            People = { copy }
        };
        bytes = book.ToByteArray();
        // And read the address book back again
        AddressBook restored = AddressBook.Parser.ParseFrom(bytes);
        // The message performs a deep-comparison on equality:
        if (restored.People.Count != 1 || !person.Equals(restored.People[0]))
        {
            throw new Exception("There is a bad person in here!");
        }
    }
  • 添加完以上代碼值骇,在ide里打個斷點莹菱,unity里面點啟動,一步步斷點跟下來可以查看究竟吱瘩。

3. 建立與服務端通信連接道伟,使用protobuff編碼解碼

4. 處理與Netty服務器通信的粘包、拆包

先去吃飯使碾,3和4部分放在下一篇

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蜜徽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子票摇,更是在濱河造成了極大的恐慌拘鞋,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矢门,死亡現(xiàn)場離奇詭異盆色,居然都是意外死亡灰蛙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門隔躲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缕允,“玉大人,你說我怎么就攤上這事蹭越。” “怎么了教届?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵响鹃,是天一觀的道長。 經常有香客問我案训,道長买置,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任强霎,我火速辦了婚禮忿项,結果婚禮上,老公的妹妹穿的比我還像新娘城舞。我一直安慰自己轩触,他們只是感情好,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布家夺。 她就那樣靜靜地躺著脱柱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天引颈,我揣著相機與錄音豌骏,去河邊找鬼。 笑死备徐,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播矩乐,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼合住!你這毒婦竟也來了绰精?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤透葛,失蹤者是張志新(化名)和其女友劉穎笨使,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體僚害,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡硫椰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年繁调,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靶草。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹄胰,死狀恐怖,靈堂內的尸體忽然破棺而出奕翔,到底是詐尸還是另有隱情裕寨,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布派继,位于F島的核電站宾袜,受9級特大地震影響,放射性物質發(fā)生泄漏驾窟。R本人自食惡果不足惜庆猫,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绅络。 院中可真熱鬧月培,春花似錦、人聲如沸恩急。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衷恭。三九已至寻行,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匾荆,已是汗流浹背拌蜘。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留牙丽,地道東北人简卧。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像烤芦,于是被迫代替她去往敵國和親举娩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容