zoukankan      html  css  js  c++  java
  • ProtoBuf在Unity中的使用

    - 网络传输协议-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; }

    }

    本博客所有内容均为原创,转载请注明出处.
  • 相关阅读:
    软链接的应用(在同一目录下方便查看日志)
    decimal模块
    python的request包
    jmeter的环境配置
    java交互方式中的同步与异步
    mysql数据库的快捷键
    [LeetCode]Number of Islands
    [LeetCode]Binary Tree Right Side View
    [LeetCode]House Robber
    [微软实习生2014]K-th string
  • 原文地址:https://www.cnblogs.com/what-lee/p/9267613.html
Copyright © 2011-2022 走看看