Unity中使用Protobuf(纯小白也可学会)

此处下载proto源码和protoc.exe文件
proto源码版本及protoc.exe文件所在位置
以写该文章时最新的版本举例,首先将protobuf-29.2.zip压缩包下载到本地,解压后就可以看见支持的各个语言的protobuf源码(protoc.exe文件在下文会介绍如何下载和使用)
csharp相关的proto源码
进入csharp文件夹内,启动.sln文件

csharp启动项
打开后选择Google.Protobuf,然后右击鼠标选择生成,控制台可能会出现项目所需SDK版本和当前电脑装的SDK版本不一致的错误
.Net SDK报错

打开cmd,输入dotnet --info查看本机当前装的.Net SDK版本
查看本机.Net SDK 版本

PS:注意文件夹目录
找到global.json文件,将里面的version改成本机的.Net SDK 版本,并保存
修改global.json内的.Net SDK 版本

再次回到VS编辑器,选择Google.Protobuf,鼠标右键选择生成,控制台输出成功后到对应的Release目录里找(如果是在Debug模式下编译的话就去Debug文件夹内找)
找到所需dll文件
将编译出来的所有文件全都复制到Unity项目中
复制所需文件到unity项目中
至此,Unity就可以使用protobuf相关的功能了,如常用的序列化和反序列化。
但是我们在和服务器对接时需要根据 .proto文件来生成对应的 .cs文件才能和服务端的同学进行数据交互处理,下面介绍如何根据 .proto文件生成对应的 .cs文件。

还记得第一步中下载protoc.exe文件吗?到下载protobuf源码的压缩包的地方找到protoc-29.2-win64.zip(根据本机平台类型选择下载win32或win64的压缩包)
下载protoc.exe
(如果找不到的话点击 Show all 14 assets就有了)

下载到本地后解压,protoc.exe文件就静静的躺在bin文件夹内(解压出来后是没有generateProto.bat文件的,下文会讲解)
解压后的protoc相关文件
有了protoc.exe文件,我们就可以将 .proto文件生成出对应的 .cs文件。
在该路径下创建proto文件夹,并新建 .proto文件
创建proto文件
有了.proto文件后,我们就可以生成.cs文件了。在解压目录的同级目录下新建generateProto.txt文件,并写上以下代码:

@echo off
cd %~dp0

set Dir_Root=%~dp0
set Dir_ProtoInput=%Dir_Root%proto
set Dir_CS_Output=%Dir_Root%../Assets/Script/cs_out

cd %Dir_Root%bin
echo currentDir: %~dp0
echo Dir_CS_Output: %Dir_CS_Output%

echo protos: %Dir_ProtoInput%/*.proto

protoc.exe -I %Dir_ProtoInput% %Dir_ProtoInput%/*.proto --csharp_out %Dir_CS_Output%

echo Build Complete!

pause

generateProto代码
将generateProto.txt的后缀改为.bat,即generateProto.bat。
双击运行该文件,即可在指定的cs文件生成目录中找到生成好的cs文件。
已生成的cs文件

以上所有操作全都是为了这步:该如何在unity中使用proto呢?
在unity工程内新建脚本,将下面代码复制并粘贴过去。

using UnityEngine;
using Google.Protobuf;//引用protobuf,没它就没法序列化/反序列化
using Protobuf;//还记得定义proto文件时提到的包名和命名空间吗?就是它了

public class ProtoDemo : MonoBehaviour
{
    private void Start()
    {
        StoreRequest request = new StoreRequest();//StoreRequest就是定义数据体的名称
        request.Name = "TestProto";
        request.Num = 100;
        request.Result = 2;
        request.MyList.Add("item1");
        request.MyList.Add("item2");
        request.MyList.Add("item3");

        byte[] bytes = request.ToByteArray();//将对象进行序列化
        
        //我们接收到的服务器数据都是bytes类型,需要对其进行反序列化解析成对应的数据体对象才能使用
        StoreRequest parsedRequest = (StoreRequest)StoreRequest.Descriptor.Parser.ParseFrom(bytes);//将序列化的数据进行反序列化
        Debug.Log($"Name: {parsedRequest.Name}, Num: {parsedRequest.Num}, Result: {parsedRequest.Result}, List: {string.Join(", ", parsedRequest.MyList)}");
    }
}

切换到Unity并运行,此时控制台就会打印出proto数据体经过 序列化 ——> 反序列化 后的数据。
打印proto数据

本文章基本上是纯小白也可成功完成操作的教程,如在操作的过程中有解决不了的问题,可以仔细对比每个步骤当中的文件路径、代码,如仍然解决不了,可以将问题提出来。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值