此处下载proto源码和protoc.exe文件
以写该文章时最新的版本举例,首先将protobuf-29.2.zip压缩包下载到本地,解压后就可以看见支持的各个语言的protobuf源码(protoc.exe文件在下文会介绍如何下载和使用)
进入csharp文件夹内,启动.sln文件
打开后选择Google.Protobuf,然后右击鼠标选择生成,控制台可能会出现项目所需SDK版本和当前电脑装的SDK版本不一致的错误
打开cmd,输入dotnet --info查看本机当前装的.Net SDK版本
PS:注意文件夹目录
找到global.json文件,将里面的version改成本机的.Net SDK 版本,并保存
再次回到VS编辑器,选择Google.Protobuf,鼠标右键选择生成,控制台输出成功后到对应的Release目录里找(如果是在Debug模式下编译的话就去Debug文件夹内找)
将编译出来的所有文件全都复制到Unity项目中
至此,Unity就可以使用protobuf相关的功能了,如常用的序列化和反序列化。
但是我们在和服务器对接时需要根据 .proto文件来生成对应的 .cs文件才能和服务端的同学进行数据交互处理,下面介绍如何根据 .proto文件生成对应的 .cs文件。
还记得第一步中下载protoc.exe文件吗?到下载protobuf源码的压缩包的地方找到protoc-29.2-win64.zip(根据本机平台类型选择下载win32或win64的压缩包)
(如果找不到的话点击 Show all 14 assets就有了)
下载到本地后解压,protoc.exe文件就静静的躺在bin文件夹内(解压出来后是没有generateProto.bat文件的,下文会讲解)
有了protoc.exe文件,我们就可以将 .proto文件生成出对应的 .cs文件。
在该路径下创建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.txt的后缀改为.bat,即generateProto.bat。
双击运行该文件,即可在指定的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数据体经过 序列化 ——> 反序列化 后的数据。
本文章基本上是纯小白也可成功完成操作的教程,如在操作的过程中有解决不了的问题,可以仔细对比每个步骤当中的文件路径、代码,如仍然解决不了,可以将问题提出来。