官方文档:https://protobuf.com.cn/overview/
1. 获取Protobuf:
1.1 通过NuGet包管理器:


拷贝dll:

选择.net2.0的dll:

导入Unity Plugins目录:

1.2 下载源码并生成dll:
GitHub - protocolbuffers/protobuf: Protocol Buffers - Google's data interchange format


解压选择csharp:

VS打开项目:


生成解决方案:

获取dll:

(.net2.0只包含Protobuf.dll,其他dll得从.net45获取)

2. 使用protoc工具获取协议对应的.cs文件:
获取protoc,v3.29.3对应 protoc-29.3-win64.zip,版本对应官方文档有说明;
新建proto文件:

使用protoc获取cs:


3. 在Unity使用cs:
序列化与反序列化工具:
cs
public class ProtoTool
{
/// <summary>
/// 序列化
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public static byte[] Serialize(IMessage message)
{
return message.ToByteArray();
}
/// <summary>
/// 反序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="packct"></param>
/// <returns></returns>
public static T DeSerialize<T>(byte[] packct) where T : IMessage, new()
{
IMessage message = new T();
try {
return (T)message.Descriptor.Parser.ParseFrom(packct);
}
catch (System.Exception e) {
throw e;
}
}
}
实例:
cs
UserInfo send = new UserInfo();
send.Name = "Lin";
send.Gold = 91000000000;
byte[] buff = ProtoTool.Serialize(send);
UserInfo recv = ProtoTool.DeSerialize<UserInfo>(buff);
Debug.Log($"{recv.Name}, {recv.Diamonds}, {recv.Gold}, {recv.Level}");
反序列化时,可从协议生成的类中获取Parser:
