Unity中使用ProtocolBuffer

unityProtocolBufferUnity ProtocolBuggerC# ProtocolBuffer

Unity中使用ProtocolBuffer

1、什么是ProtocolBuffer

Google提供一个具有高效可序列化的数据交互格式。

2、ProtocolBuffer优势

  1. 性能好/效率高
  2. 自动代码生成:通过模板自动生成对应语言模型类
  3. 支持向后兼容和向前兼容:当客户端和服务器同事使用一块协议的时候, 当客户端在协议中增加一个字节,并不会影响客户端的使用
  4. 与平台和语言无关(多语言支持)
  5. 扩展性好(开源)

Tips:兼容性注意点:

  1. 不要修改已存字段的标签号
  2. 新添加的字段必须使用optional和repeated限定符
  3. 不能移除已存在的required字段,虽然可以移除旧的optional和repeated类型字段,但是原有的标签号必须保留,避免被新字段重用
  4. int32、uinit32、int64和bool等互相兼容,sint32和sint64兼容,string和byte兼容,fixed32和fixed64,sfixed64兼容,若要修改旧字段类型徐保证兼容性

3、使用

3.1 .Proto文件

这是protobuf提供的一种特殊的脚本,具有格式简单、可读性强和方便拓展的特点,所以接下来我们就是使用proto脚本来定义一个UserInfo类型。

  1. syntax ="proto3"; 


  2. package ProtoMsg; 



  3. message UserInfo{ 


  4. int32 ID=1;//用户ID,服务器自动生成,用户注册成功后返回给客户端 


  5. string Account=2;//帐号 


  6. string Password=3;//密码 






语法:

  • required:必有的属性
  • optional:可选属性
  • repeated:数组

3.2 Protobuf---->C#

我们需要在Unity等C#环境使用PB就需要把如上我们定义的类型转为cs文件,自动生成工具如下:

Protobuf2CS

[

通过如下.bat文件可统一将该目录下ProtoFile下我们定义的如上UserInfo.proto文件转为.cs代码

@echo off

set "PROTOC_EXE=%cd%\tool\protoc.exe"
set "WORK_DIR=%cd%\ProtoFile"
set "CS_OUT_PATH=%cd%\cs"
::if not exist %CS_OUT_PATH% md %CS_OUT_PATH% for /f "delims=" %%i in ('dir /b protoFile "ProtoFile/*.proto"') do (
echo gen protoFile/%%i...
%PROTOC_EXE% --proto_path="%WORK_DIR%" --csharp_out="%CS_OUT_PATH%" "%WORK_DIR%\%%i"
)
echo finish... pause

生成后的CS文件可直接作为模型类使用

4、使用

首先、我们需要把Google.protobuf.dll引入到工程项目中去。之后就可以用其提供的序列化和反序列化方法来直接使用。需要注意的是所有的模型类都实现了IMessage接口,因此我们可以在结发的入口中直接通过IMessage类型来处理数据,在通过协议把他转换为相应定义的数据类型.

  1. byte[] userBytes= ProtobufHelper.ToBytes(user); 


  2. UserInfo userFromBytes = ProtobufHelper.FromBytes<UserInfo>(userBytes);

Unity中使用ProtocolBuffer的更多相关文章

  1. C#使用ProtocolBuffer(ProtoBuf)进行Unity中的Socket通信

    首先来说一下本文中例子所要实现的功能: 基于ProtoBuf序列化对象 使用Socket实现时时通信 数据包的编码和解码 下面来看具体的步骤: 一.Unity中使用ProtoBuf 导入DLL到Uni ...

  2. Unity中使用Attribute

    Attribute是c#的语言特性 msdn说明如下: The Attribute class associates predefined system information or user-def ...

  3. 在Unity中使用UGUI修改Mesh绘制几何图形

    在商店看到这样一个例子,表示很有兴趣,他们说是用UGUI做的.我想,像这种可以随便变形的图形,我第一个就想到了网格变形. 做法1: 细心的朋友应该会发现,每个UGUI可见元素,都有一个‘Canvas ...

  4. Unity中使用WebView

    Unity中使用WebView @(设计) 需求,最近游戏中需要引入H5直播页面和更新比较频繁的赛事页面,需求包括:加密传参数.和Unity交互,在Unity框架下其实有几种方案: 内置函数Appli ...

  5. Unity中创建二维码

    在网络上发现了一个可以把字符串转换成二维码的dll,但是我们要怎么使用他呢.不废话,直接进入主题. 用到的引用 using UnityEngine;using ZXing;using ZXing.Qr ...

  6. 在Unity中创建可远程加载的.unity3d包

    在一个Unity项目中,发布包本身不一定要包括所有的Asset(译为资产或组件),其它的部分可以单独发布为.unity3d,再由程序从本地/远程加载执行,这部分不在本文讨论范围.虽然Unity并没有直 ...

  7. 【原创翻译】初识Unity中的Compute Shader

    一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位 ...

  8. 【unity shaders】:Unity中的Shader及其基本框架

    shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...

  9. Unity中各个平台的预编译的运用方式

    1,unity中官方文档的一个操纵关键词   Platform Dependent Compilation 2,常用的预编译关键词    UNITY_EDITOR    编辑器调用.UNITY_STA ...

  10. 解读Unity中的CG编写Shader系列七(不透明度与混合)

    转自http://www.itnose.net/detail/6098539.html 1.不透明度 当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段 ...

随机推荐

  1. 读书笔记 dotnet 的字符串在内存是如何存放

    本文是读伟民哥翻译的 .NET内存管理宝典 这本书的笔记,我认为读书的过程也需要实践,这样对一知半解的知识也有较为清晰的了解.在阅读到 string 在内存的布局时,我看到 RuntimeHelper ...

  2. 后端每日一题 2:DNS 解析过程

    本文首发于公众号:腐烂的橘子 本文梗概: DNS 是什么,有什么作用 一条 DNS 记录是什么样的 DNS 域名解析原理 DNS 服务器如何抵御攻击 DNS 是什么,有什么作用 DNS(Domain ...

  3. van-tab吸顶后头部透明色渐变响应

    方法一:监听滚动事件 $('.scrollContent').bind('touchmove', function(e){             var  winHeight = $(window) ...

  4. Go-Zero微服务快速入门和最佳实践(一)

    前言 并发编程和分布式微服务是我们Gopher升职加薪的关键. 毕竟Go基础很容易搞定,不管你是否有编程经验,都可以比较快速的入门Go语言进行简单项目的开发. 虽说好上手,但是想和别人拉开差距,提高自 ...

  5. 【爬虫+数据清洗+可视化分析】Python舆情分析哔哩哔哩"狂飙"的评论

    目录 一.背景介绍 二.爬虫代码 2.1 展示爬取结果 2.2 爬虫代码讲解 三.可视化代码 3.1 读取数据 3.2 数据清洗 3.3 可视化 3.3.1 IP属地分析-柱形图 3.3.2 评论时间 ...

  6. 在python中安装包出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))

    所以最终的 解决办法:pip install keras -i http://pypi.douban.com/simple --trusted-host pypi.douban.com(其中的kera ...

  7. spring-boot集成Quartz-job存储方式一JDBC

    1.项目jar包依赖引入 <dependency> <groupId>org.springframework.boot</groupId> <artifact ...

  8. JDK源码阅读-------自学笔记(十四)(java.util.Calendar日历类)

    Calendar 提供了关于日期计算的相关功能,比如:年.月.日.时.分.秒的展示和计算. GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的 ...

  9. avue-crud字段之间的动态交互效果以及接口数据的获取赋值

    一.form表单下拉表单类型字段数据获取 1.通过配置系统字典接口获取数据并渲染 { label: "经纪人", prop: "broker", type: & ...

  10. lvs之DR模式的实操演练

    理论 我是内部服务,代替我访问外部网络,这是正向代理:代替外部网络访问我,这是反向代理 槽位 sh根据源地址.调度到某个节点,dh,根据目标地址,调度到某个节点, 实战演练 默认策略以及修改策略 查看 ...