首页 > 技术文章 > ProtoBuf在Unity中的使用

what-lee 2018-07-05 11:59 原文

- 网络传输协议-ProtoBuf

ProtoBuf是Google开源的一套二进制流网络传输协议,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、Go 和Python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

优点:传输效率快(比xml和json快10-20倍),文档型协议; 
缺点:使用不太方便;

这里简单解释一下什么是文档型协议,向我们的xml和json一般在使用的时候都需要保存一份说明文档和一个实际的java类,而protobuf在使用的时候其定义的格式就是说明文档,简单明了而且可以将其编译成各个平台的类库,以java平台为例,其编程成jar之后,若定义文件发生了变化,则在使用jar包的话就会报错,必须重新编译,这也就保证了App端与服务器端的协议统一性。

与Unity通讯参考:网上都说需要使用ProteBuf-net, 因为c++版本的源代码不支持Unity3D游戏在各个平台上的动态库构建    https://www.jianshu.com/p/b135676dbe8d 

在github上下载了-net版本  巨慢. 而且其实如果是Unity开发的话只需要一个文件夹 就是protobuf-net  里边的东西就行了. 如果有需要的可以留言, 我这有网盘存了

将这个.unitypackage放到工程中

 

 

下边是例子

 

using ProtoBuf;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

[ProtoContract]
public class Test : MonoBehaviour
{

// Use this for initialization
void Start()
{


//Person person = new Person();
//person.Id = 1;
//person.Name = "First";
//person.Address = new Address();
//person.Address.Line1 = "Line1";
//person.Address.Line2 = "Line2";

//FileStream file = File.Create("Assets/Person.bin");
//Serializer.Serialize(file, person);
//file.Close();


FileStream file = File.OpenRead("Assets/Person.bin");
Person p = Serializer.Deserialize<Person>(file);
file.Close();
print(p.Address);
print(p.Id);
print(p.Name);
print(p.Address.Line1);
print(p.Address.Line2);

}

// Update is called once per frame
void Update()
{

}
}
[ProtoContract]
public class Person
{
[ProtoMember(1)]
public int Id { get; set; }

[ProtoMember(2)]
public string Name { get; set; }

[ProtoMember(3)]
public Address Address { get; set; }

 

}

[ProtoContract]
public class Address
{
[ProtoMember(1)]
public string Line1 { get; set; }

[ProtoMember(2)]
public string Line2 { get; set; }

}

推荐阅读