在Unity3D中使用Protobuf3

 

Protobuf:平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,通常用于网络通讯和数据存储前端

第一步:下载并准备DLL文件

连接:mvn9(或者 https://github.com/protocolbuffers/protobuf/tree/82d3d7d250645322f8a7343188e5ae6246a76414git

先设置下DLL导出版本,不一样版本的Unity3D可能对应的net版本不一样github

  1. 进入路径:protobuf-3.7.0\csharp\src\Google.Protobuf
  2. 编辑 Google.Protobuf.csproj 文件,准备设置DLL导出版本(不知道怎么编辑的记事本打开......)
  3. 找到里面的语句:<TargetFrameworks>netstandard1.0;net45;后面的 net45 就是DLL导出版本,想要同时导出多个版本将版本号用分号隔开就好,若是你不知道要导出的版本是哪一个,能够百度一下?(通常来说Unity2018的都是4.5,2017都是3.5)

以后就能够开始生成DLL了数组

  1. 进入路径:protobuf-3.7.0\csharp\src
  2. 打开 Google.Protobuf.sln 文件(我用的是VS2017)
  3. 右键 Google.Protobuf 点击生成
  4. 这个时候再进入路径:protobuf-3.7.0\csharp\src\Google.Protobuf\bin\Debug\net45,里面就是你生成的DLL文件

 

第二步:Protobuf简单使用

打开 ProtobufTool_Rect 傻瓜包,在里面新建.proto文件以下(随便起名就好):网络

编辑一下proto文件,在里面输入如下内容数据结构

syntax = "proto3";		//proto语法版本
package jaihk662;		//包名
message TestForProto	//一个message至关于一个类
{
    string name = 1;			//后面的 = 1是参数标签,必须有
    int32 age = 2;
    repeated int32 pos = 3;		//repeated能够理解为List,等价于List<int> pos;
}

以后你懂得,点击 buildC#.bat 就能够一键生成了,生成的.cs能够在 C#protocs 文件夹中找到测试

若是生成失败,说明你有语法错误,检查一下.proto内有没有打错字母等......ui

 

第三步:在Unity3D中测试

将你第二步生成的.cs文件和第一步生成的.dll文件所有放入你的项目里(放入Assest,建议新建一个文件夹进行管理)spa

到这一步其实你就已经会用Protobuf了,恭喜!(固然只针对前端)3d

接下来测试一下,随便新建一个脚本,输入如下代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Jaihk662;            //引用.cs文件中的命名空间(.proto文件中的package值)
using Google.Protobuf;     //引用DLL
public class AASD : MonoBehaviour
{
    void Start()
    {
        TestForProto toServer = new TestForProto();
        toServer.Name = "Jaihk662";
        toServer.Age = 22;
        for (int i = 5; i <= 7; i++)
            toServer.Pos.Add(i);

        //将对象转换成字节数组
        byte[] databytes = toServer.ToByteArray();

        //将字节数据的数据还原到对象中
        IMessage IMperson = new TestForProto();
        TestForProto toClient = new TestForProto();
        toClient = (TestForProto)IMperson.Descriptor.Parser.ParseFrom(databytes);

        Debug.Log(toClient.Name);
        Debug.Log(toClient.Age);
        for (int i = 0; i < toClient.Pos.Count; i++)
            Debug.Log(toClient.Pos[i]);
    }
    void Update()
    {
        
    }
}

搞定!