【Unity3D】簡單詳解 Protobuf 案例 從下載到安裝和使用
Protobuf介紹
Protocol Buffers是Google的一種資料交換的格式,一種輕量&高效的結構化資料儲存格式。可以用於結構化資料序列化(序列化)。由於它是二進位制的格式,比使用xml,Json進行資料交換快很多。
下面開始講解使用整個過程:
第一步: 下載
本人下載的是protobuf-net r668.zip
也可以到我的百度網盤下載 protobuf-net r668.zip
密碼:qfpx
下載後解壓得到以下檔案:
第二步: 編寫Proto檔案
1.建立 login.proto 檔案
2. 開啟 login.proto 檔案 並編寫以下內容
message PlayerInfo
{
optional string name = 1;
optional string sex = 2;
}
message LoginInfo
{
optional PlayerInfo playerInfo = 1;
required uint32 userId = 2;
}
第三步:生成CS
1. 把從在 第一步 解壓出來的 protobuf-net r668.zip 檔案中 複製 Precompile 和 ProtoGen 資料夾 拷貝到 login.proto 同目錄下
2. 在 login.proto 同目錄 建立 ProtoTools.bat
@echo off
set tool=ProtoGen
set proto=login.proto
%tool%\protogen.exe -i:%proto% -o:%proto%.cs -ns:MyProto
pause
3. 雙擊 ProtoTools.bat 然後 按Enter鍵 就生成了 login.proto.cs 檔案(如果出現了錯誤 就檢查一下 批處理命令 欄位 是否正確)
第四步: 生成dll檔案
1. 把從 第一步 解壓出來的 protobuf-net r668.zip 檔案中 Full / unity 資料夾拷貝到 login.proto
2. 開啟 ProtoTools.bat 檔案 新增 生成 dll 命令,新增後的命令 如下
@echo off
set tool=ProtoGen
SET BASE_DIR=%CD%
SET PROTO_PER_COMPILE_BIN=\Precompile\precompile.exe
SET DLL_NAME=ProtoCoreData.dll
SET DOT_NET_VER=v2.0.50727
SET CSC_MAKE=C:\Windows\Microsoft.NET\Framework\%DOT_NET_VER%\csc.exe
set proto=login.proto
%tool%\protogen.exe -i:%proto% -o:%proto%.cs -ns:MyProto
%CSC_MAKE% /r:%BASE_DIR%\unity\protobuf-net.dll /out:%DLL_NAME% /target:library *.cs
%BASE_DIR%%PROTO_PER_COMPILE_BIN% %DLL_NAME% -o:Serialzer_%DLL_NAME% -p:%BASE_DIR%\unity\ -t:ProtobufSerializer
pause
3. 雙擊 ProtoTools.bat 檔案 按 Enter 鍵 生成 ProtoCoreData.dll 和 Serialzer_ProtoCoreData.dll 檔案
第五步: 在Unity裡使用Protobuf
1. 把生成出來的 ProtoCoreData.dll 和 Serialzer_ProtoCoreData.dll 檔案 拷貝到 Unity工程 Assets/Plugins/protobuf 目錄下
2. 把在 login.proto 同目錄下的 unity資料夾 裡面 找到 protobuf-net.dll 檔案 然後拷貝到 Unity工程 Assets/Plugins/protobuf 目錄下
3. 建立CS程式碼 並 執行
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestProto : MonoBehaviour {
ProtobufSerializer serializer = new ProtobufSerializer();
// Use this for initialization
void Start () {
MyProto.LoginInfo req = new MyProto.LoginInfo();
MyProto.PlayerInfo playerInfo = new MyProto.PlayerInfo();
playerInfo.name = "哈哈";
req.playerInfo = playerInfo;
//此 二進位制串用於 與 伺服器互動
byte[] data = SerializeProto(req);
//用於 讀取 伺服器發過來的資料
MyProto.LoginInfo proto = DeSerializeProto(data, typeof(MyProto.LoginInfo)) as MyProto.LoginInfo;
Debug.Log(proto.playerInfo.name);
}
//序列化
byte[] SerializeProto(ProtoBuf.IExtensible proto)
{
byte[] data = null;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
serializer.Serialize(ms, proto);
if (ms.Length > 0)
{
data = new byte[(int)ms.Length];
ms.Seek(0, System.IO.SeekOrigin.Begin);
ms.Read(data, 0, data.Length);
}
ms.Close();
}
return data;
}
//反序列化
ProtoBuf.IExtensible DeSerializeProto(byte[] data, Type type)
{
ProtoBuf.IExtensible proto = null;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
ms.Write(data, 0, data.Length);
ms.Seek(0, System.IO.SeekOrigin.Begin);
proto = serializer.Deserialize(ms, null, type) as ProtoBuf.IExtensible;
ms.Close();
}
return proto;
}
// Update is called once per frame
void Update () {
}
}