前言:当我们进入一个新游戏,往往需要注册一个账号,那么每个账号可以看作是一个对象信息。当点击注册按钮的同时,账号信息即结构化数据先转换成比特流形式数据,后经过网络传输到服务器端,在服务器端再将比特流数据转成结构化数据,最后进行信息的存储。
Protobuf简介
(1)Protobuf就是一种结构型数据的序列化方法,类比于Json、Xml,弥补Unity当中不能够被SeriliazeField修饰的数据;
(2)Protobuf支持多种编程语言,由于是二进制文件相较于Json、Xml的性能更好,效率更高;
(3)同时缺点并存,基于二进制格式,自然可读性和通用性就相对较差。
Protobuf使用
-
下载相应版本的Protobuf和Protoc(C#版本)
protobuf安装包地址:github.com/protocolbuf…
查看.net版本信息(cmd键入:dotnet –Version),Github对应查看protobuf\global.json文件下环境,下载对应版本的protobuf和protoc。
-
生成对应dll文件,引入Unity
进入.\src文件夹,VS打开.sln后缀文件,选中下图Google.Protobuf右键生成即可。进入net45文件夹下即可看到对应的dll文件,将其放入Unity中Plugins文件夹下。(如果报错,将net45文件夹全部文件拽入即可)
.proto文件书写
- .proto文件–定义消息中存储的信息类型
//本文引例:Person.proto,文件名尽量和下文的message后的名字一致,便于管理;
syntax="proto3"
message Person{
optional int32 account=1;//这里的1是指属性顺序,并非赋值,第1个,后续可供扩展
string password=2;
}
//更多写法请查阅官网
Protoc使用
-
解压对应的Portoc文件之后,为了便于使用cmd命令行进行文件转译,建议配置一下环境变量(cmd命令输入:sysdm.cpl–PATH中添加protoc的安装目录”.\Protoc\bin”)
-
cmd命令行编译.proto文件:
1、cmd进入.proto文件所在的文件夹;
2、cmd键入”protoc –csharp_out=. Person.proto”,转换成功即可在文件夹中看到相应的.cs文件;
3、以上针对的是对于单个文件进行处理,那么项目当中我们可能存在多个.proto文件时,此时使用.bat批处理文件进行转译。
//新建文本文档,复制以下代码,改为.bat后缀,放在目标.proto文件的文件夹下,点击运行即可。
@echo off
for %%i in (*.proto) do (
protoc --csharp_out=./ %%i
)
pause
Unity中应用
准备:Plugins文件夹下引入DLL、转译生成的.cs文件拖入、新建脚本using Google.Protobuf
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Google.Protobuf;//自行引入
public class Test_Protobuf : MonoBehaviour
{
Person person;//.cs定义的Person类
byte[] data;//传输的字节流--Unity中Socket传输也是基于此
void Start()
{
person = new Person
{
//赋值属性
account = 123456;
password = "654321"
};
data = person.ToByteArray();//序列化
Debug.Log(FromProto(data).acccount);
}
//反序列化
Person FromProto(byte[] buffer){
IMessage message = new Person();
Person person=message.Descriptor.Parser.ParseFrom(buffer) as Person;
return person;
}
}
以上就是Unity中客户端中使用C#简单使用protobuf的示例,服务器端的解析发送等则根据服务器端语言同理变更。
总结
在unity中使用Protobuf进行网络传输的时候,提升了数据存储和运输效率,在一些低时延的游戏中应用较为广泛。实际应用中,序列化和反序列化的应用方法通常需要自行封装调用,文件的转译也可以在Unity中进行封装,当然Unity中也有相关插件供开发者使用。