Unity中应用Protobuf:简易教程

  前言:当我们进入一个新游戏,往往需要注册一个账号,那么每个账号可以看作是一个对象信息。当点击注册按钮的同时,账号信息即结构化数据先转换成比特流形式数据,后经过网络传输到服务器端,在服务器端再将比特流数据转成结构化数据,最后进行信息的存储。

yuque_diagram.png

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文件夹全部文件拽入即可)

image.png

image.png

.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文件;
    image.png
    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;
    }
}

image.png

  以上就是Unity中客户端中使用C#简单使用protobuf的示例,服务器端的解析发送等则根据服务器端语言同理变更。

总结

  在unity中使用Protobuf进行网络传输的时候,提升了数据存储和运输效率,在一些低时延的游戏中应用较为广泛。实际应用中,序列化和反序列化的应用方法通常需要自行封装调用,文件的转译也可以在Unity中进行封装,当然Unity中也有相关插件供开发者使用。

yuque_diagram.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYmBwaMw' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片