Protobuf 学习简记(二)Unity C#中的引用与使用
安装相关包
使用VS下载安装
首先在项目打开的VS中打开脚本–>点击项目,点击管理NuGet程序包。
搜索Google.Protobuf.Tools,并进行安装,如下两图。
等待下载完成会打印log,如下图:
去Unity项目的Packages文件夹(在资源管理器中显示)。
进入,选择tools,然后找到自己要用的,这里我选windows_x86。
进入可以看到如下文件,可以选择配置环境变量使用,也可以选择在此文件夹内运行CMD,我选择后者,可以查看版本号。
然后配置Google.Protobuf包。同样是从Nuget搜索,如下图,下载安装。
这个安装完成之后包会对一些,如下图:
拷贝DLL文件,根据自己所需的版本平台,将以下目录所有dll拷贝到Unity中Plugins文件夹内(版本按需选择,真实场景可能用不了这么多)。
- Google.Protobuf
- System.Buffers
- System.Memory
- System.Numerics.Vectors
- System.Runtime.CompilerServices.Unsafe
在Protobuf官网下载编译
- 去Protobuf官网下载对应操作系统的protoc,用于将.proto文件生成对应语言的协议语言文件。
- 由于我使用的是C#所以可以使用提供的C#的序列化反序列化的项目,然后自己编译出DLL放入Unity中使用。
数据文件(.proto)生成CS文件
结合文章https://blog.csdn.net/f_957995490/article/details/129175882,创建一个符合项目需求的.proto文件。
然后,生成cs文件的方法我这里给出有两种。
1.CMD运行
- 打开cmd窗口
- 进入protoc.exe所在文件夹(也可以直接拖入到cmd中)
- 输入转换指令:
.\protoc.exe -I=配置路径 =csharp_out=输出路径 配置文件名
可以先把.proto文件复制到protoc.exe同目录下过来,运行cmd输入以下代码输出cs文件。
.\protoc --csharp_out=./ ./Invite.proto
执行完多了一个cs文件。
最后将生成的cs文件导入Unity项目进行解析使用,就可以了。
2.Unity项目中使用C#代码操作
简单地说就是讲上面1的操作由代码完成:
using System.Diagnostics;
using System.IO;
using UnityEditor;
public static class GenerateProtobuf
{
private const string ProtocExePath = @"D:\Projects\UnityProjects\First\Packages\Google.Protobuf.Tools.3.22.0\tools\windows_x86\protoc.exe";
private const string ProtoPath = @"D:\Projects\UnityProjects\First\Assets\Editor\Proto";
private const string OutPath = @"D:\Projects\UnityProjects\First\Assets\Script\Protobuf\AutoGeneratedScript";
[MenuItem("Protobuf/GenerateCSharp")]
private static void GenerateCSharp()
{
DirectoryInfo directoryInfo = new DirectoryInfo(ProtoPath);
FileInfo[] fileInfos = directoryInfo.GetFiles();
foreach (var fileInfo in fileInfos)
{
if (fileInfo.Extension != ".proto")
continue;
Process cmd = new Process();
cmd.StartInfo.FileName = ProtocExePath;
cmd.StartInfo.Arguments = $"-I={ProtoPath} --csharp_out={OutPath} {fileInfo.Name}";
//UnityEngine.Debug.Log(cmd.StartInfo.Arguments);
cmd.Start();
}
}
}
这里我将路径都设置在了项目中方便查看。
UnityC#使用
经过上面的操作后,Unity项目:
所对应的.proto文件,在文章https://blog.csdn.net/f_957995490/article/details/129175882中。
TestMsg1 myTestMsg = new TestMsg1();
myTestMsg.TestInt32 = 1;
myTestMsg.ArrString.Add("wy");
myTestMsg.ArrString.Add("pnb");
myTestMsg.ArrString.Add("lzq");
myTestMsg.Map1.Add(1, "ywj");
myTestMsg.Map1.Add(2, "zzs");
TestMsg1 myTestMsg = new TestMsg1
{ TestInt32 = 1 };
myTestMsg.ArrString.Add("wy");
myTestMsg.ArrString.Add("pnb");
myTestMsg.ArrString.Add("lzq");
myTestMsg.Map1.Add(1, "ywj");
myTestMsg.Map1.Add(2, "zzs");