Unity中使用ProtocolBuffer
Unity中使用ProtocolBuffer
Unity中使用ProtocolBuffer
1、什么是ProtocolBuffer
Google提供一个具有高效可序列化的数据交互格式。
2、ProtocolBuffer优势
- 性能好/效率高
- 自动代码生成:通过模板自动生成对应语言模型类
- 支持向后兼容和向前兼容:当客户端和服务器同事使用一块协议的时候, 当客户端在协议中增加一个字节,并不会影响客户端的使用
- 与平台和语言无关(多语言支持)
- 扩展性好(开源)
Tips:兼容性注意点:
- 不要修改已存字段的标签号
- 新添加的字段必须使用optional和repeated限定符
- 不能移除已存在的required字段,虽然可以移除旧的optional和repeated类型字段,但是原有的标签号必须保留,避免被新字段重用
- int32、uinit32、int64和bool等互相兼容,sint32和sint64兼容,string和byte兼容,fixed32和fixed64,sfixed64兼容,若要修改旧字段类型徐保证兼容性
3、使用
3.1 .Proto文件
这是protobuf提供的一种特殊的脚本,具有格式简单、可读性强和方便拓展的特点,所以接下来我们就是使用proto脚本来定义一个UserInfo类型。
- syntax ="proto3";
- package ProtoMsg;
- message UserInfo{
- int32 ID=1;//用户ID,服务器自动生成,用户注册成功后返回给客户端
- string Account=2;//帐号
- 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类型来处理数据,在通过协议把他转换为相应定义的数据类型.
- byte[] userBytes= ProtobufHelper.ToBytes(user);
- UserInfo userFromBytes = ProtobufHelper.FromBytes<UserInfo>(userBytes);
Unity中使用ProtocolBuffer的更多相关文章
- C#使用ProtocolBuffer(ProtoBuf)进行Unity中的Socket通信
首先来说一下本文中例子所要实现的功能: 基于ProtoBuf序列化对象 使用Socket实现时时通信 数据包的编码和解码 下面来看具体的步骤: 一.Unity中使用ProtoBuf 导入DLL到Uni ...
- Unity中使用Attribute
Attribute是c#的语言特性 msdn说明如下: The Attribute class associates predefined system information or user-def ...
- 在Unity中使用UGUI修改Mesh绘制几何图形
在商店看到这样一个例子,表示很有兴趣,他们说是用UGUI做的.我想,像这种可以随便变形的图形,我第一个就想到了网格变形. 做法1: 细心的朋友应该会发现,每个UGUI可见元素,都有一个‘Canvas ...
- Unity中使用WebView
Unity中使用WebView @(设计) 需求,最近游戏中需要引入H5直播页面和更新比较频繁的赛事页面,需求包括:加密传参数.和Unity交互,在Unity框架下其实有几种方案: 内置函数Appli ...
- Unity中创建二维码
在网络上发现了一个可以把字符串转换成二维码的dll,但是我们要怎么使用他呢.不废话,直接进入主题. 用到的引用 using UnityEngine;using ZXing;using ZXing.Qr ...
- 在Unity中创建可远程加载的.unity3d包
在一个Unity项目中,发布包本身不一定要包括所有的Asset(译为资产或组件),其它的部分可以单独发布为.unity3d,再由程序从本地/远程加载执行,这部分不在本文讨论范围.虽然Unity并没有直 ...
- 【原创翻译】初识Unity中的Compute Shader
一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位 ...
- 【unity shaders】:Unity中的Shader及其基本框架
shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...
- Unity中各个平台的预编译的运用方式
1,unity中官方文档的一个操纵关键词 Platform Dependent Compilation 2,常用的预编译关键词 UNITY_EDITOR 编辑器调用.UNITY_STA ...
- 解读Unity中的CG编写Shader系列七(不透明度与混合)
转自http://www.itnose.net/detail/6098539.html 1.不透明度 当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段 ...
随机推荐
- [FAQ] Error 1142: INDEX command denied to user
MySQL 用户没有某个命令权限时提示的错误.具体这里提示的是没有 index 命令权限. 把某库的所有表的 index 命令授权给用户即可: grant index on xxdb.* to 'xx ...
- WPF 如何在静态资源定义字体大小
默认的 WPF 的字体大小的单位是像素,如果想要将字体大小使用 pt 点表示,写在 xaml 里面是直接添加 pt 后缀.但是此时如果在静态资源尝试定义的时候写上了 pt 将会在运行的时候提示无法转换 ...
- (数据科学学习手札160)使用miniforge代替miniconda
本文已收录至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,conda作为Python数据科学领域 ...
- STM32中的看门狗
先复制一段度娘的东西: 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个 ...
- 本地git用cmd窗口提交时编辑模式退出问题
git commit后输入提交描述. 输入完成后按Esc (退出编辑状态),接着连按两次大写字母Z,就保存好退出了.
- 腾讯、阿里、B站最新面经汇总,有的妥妥的凉经。
除了BAT(没错我说的B是B站的B),还有网易.希音科技.美柚等中小厂的最新面经. 这次投稿的同学行文幽默风趣,处处透漏着不成功便搞笑的骚气. 祝他早日上岸,也欢迎大家在评论区讨论这些面试题,有哪些面 ...
- MQ消息积压,把我整吐血了
前言 我之前在一家餐饮公司待过两年,每天中午和晚上用餐高峰期,系统的并发量不容小觑. 为了保险起见,公司规定各部门都要在吃饭的时间轮流值班,防止出现线上问题时能够及时处理. 我当时在后厨显示系统团队, ...
- ASP.NET Core如何禁用模型验证(或者从模型状态中移除某些属性)?
这是一篇4年前的文章:[经验分享]在ASP.NET Core中,如果禁用某个请求的模型验证? 事隔多年,又有网友问到这个问题.我就来重新整理一下,顺便扩展一下之前的解决办法. ===== 这是一个来自 ...
- Metabase 安装和使用教程
Metabase 是一款开源的数据分析和商业智能工具,允许企业用户在几分钟内搭建起一个功能完善的数据探索和数据分析平台,不需要编写复杂的 SQL 查询语句或者使用专业的数据可视化工具,就可以轻松地探索 ...
- Python:当函数做为参数时的技巧
我们之前在<Python技法3: 匿名函数.回调函数.高阶函数>中提到,可以通过lambda表达式来为函数设置默认参数,从而修改函数的参数个数: import math def dista ...