熊熊出没 发表于 2025-1-14 06:04:20

Unity Protobuf实践

官方文档:https://protobuf.com.cn/overview/
1. 获取Protobuf:

1.1 通过NuGet包管理器:
        https://i-blog.csdnimg.cn/direct/e3a43a6fa0a04b54909178499164dbc3.png
        https://i-blog.csdnimg.cn/direct/9168744fd944450a9d49d48c915fe124.png
拷贝dll:
        https://i-blog.csdnimg.cn/direct/eea2b5954b624360826b92cbb7d768c3.png
选择.net2.0的dll:
        https://i-blog.csdnimg.cn/direct/bb0f489da7fc47aaa5cb6d0cf05a2ca0.png
导入Unity Plugins目次:
        https://i-blog.csdnimg.cn/direct/6ab5b620af7646b18ac0fa65ff0d7523.png
1.2 下载源码并生成dll:
GitHub - protocolbuffers/protobuf: Protocol Buffers - Google's data interchange format
        https://i-blog.csdnimg.cn/direct/fd67e283142e44e2ae7ab2dabfd0881c.png
        https://i-blog.csdnimg.cn/direct/84278f3a5bbb4eafbe125ee9f7682f42.png
解压选择csharp:
        https://i-blog.csdnimg.cn/direct/dd90b09550934961908b91dc83dc6a86.png
VS打开项目:
        https://i-blog.csdnimg.cn/direct/f0b8edc2d55141ea99e980e12c8319a0.png
        https://i-blog.csdnimg.cn/direct/a68948e9865f4401b112268f643e7425.png
生成解决方案:
        https://i-blog.csdnimg.cn/direct/f19956dc58a74aa9b48bf73a4a781c51.png
获取dll:
        https://i-blog.csdnimg.cn/direct/c1e9a38b66774ab19e5aae75d813b98b.png
        (.net2.0只包罗Protobuf.dll,其他dll得从.net45获取)
        https://i-blog.csdnimg.cn/direct/d12bb9a7d42b4b899142be418fb3d472.png
2. 利用protoc工具获取协议对应的.cs文件:

获取protoc,v3.29.3对应 protoc-29.3-win64.zip,版本对应官方文档有说明;
新建proto文件:
        https://i-blog.csdnimg.cn/direct/075d2830abd14557b587390bf808e3cd.png
利用protoc获取cs:
        https://i-blog.csdnimg.cn/direct/b70427a470c44a2da03b7684b943c16e.png
        https://i-blog.csdnimg.cn/direct/1757813606b3497fbdadc0e122a2991d.png
3. 在Unity利用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;
      }
    }
} 实例:
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:
https://i-blog.csdnimg.cn/direct/c8c7c354c41744c3986c0c4893022ae4.png
参考:在Unity中利用Protobuf进行序列化_unity c# proto buffer-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Unity Protobuf实践