1. 程式人生 > >【Unity3D】簡單詳解 Protobuf 案例 從下載到安裝和使用

【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 () {
		
	}
}