当前位置:   article > 正文

Unity Protobuf 简单 案例 详解 从下载到安装和使用_unity 安装 protobuf-net

unity 安装 protobuf-net

Protobuf介绍

Protocol Buffers是Google的一种数据交换的格式,一种轻量&高效的结构化数据存储格式。可以用于结构化数据串行化(序列化)。由于它是二进制的格式,比使用xml,Json进行数据交换快很多。

查看原理请打开: https://blog.csdn.net/carson_ho/article/details/70568606 

 

Demo地址【Unity】:https://download.csdn.net/download/qq_30259857/10903325

 

下面开始讲解使用整个过程:

 

第一步: 下载

下载编译后的 Protobuf: https://code.google.com/archive/p/protobuf-net/downloads(打开此网站需要开启 VPN,本人用的是风速SSR)

本人下载的是 protobuf-net r668.zip

也可以到我的百度网盘下载  protobuf-net r668.zip

链接:https://pan.baidu.com/s/1abf2xppxg9sQuyFxRlHAXA

密码:qfpx

下载后解压得到以下文件:

第二步: 编写Proto文件

1.创建 login.proto 文件

2. 打开 login.proto 文件 并编写以下内容

  1. message PlayerInfo
  2. {
  3. optional string name = 1;
  4. optional string sex = 2;
  5. }
  6. message LoginInfo
  7. {
  8. optional PlayerInfo playerInfo = 1;
  9. required uint32 userId = 2;
  10. }

说明一下修饰符的意义

Required:必须字段,发送方必须赋该字段的值,对接收方,必须识别该字段的值

Optional:可选字段,可不赋值

Repeated:包含0-N个元素,一般为 list 或者 数组

 

第三步:生成CS

1. 把从在 第一步 解压出来的 protobuf-net r668.zip 文件中 复制 Precompile 和 ProtoGen 文件夹 拷贝到 login.proto 同目录下

2.  在 login.proto 同目录 创建 ProtoTools.bat 文件 并 打开编写如下命令

  1. @echo off
  2. set tool=ProtoGen
  3. set proto=login.proto
  4. %tool%\protogen.exe -i:%proto% -o:%proto%.cs -ns:MyProto
  5. pause

3. 双击 ProtoTools.bat 然后 按Enter键 就生成了 login.proto.cs 文件(如果出现了错误 就检查一下 批处理命令 字段 是否正确)

 

第四步: 生成dll文件

1.  把从 第一步 解压出来的  protobuf-net r668.zip 文件中 Full / unity 文件夹拷贝到 login.proto 同目录下

2.  打开 ProtoTools.bat 文件 添加 生成 dll 命令,添加后的命令 如下

  1. @echo off
  2. set tool=ProtoGen
  3. SET BASE_DIR=%CD%
  4. SET PROTO_PER_COMPILE_BIN=\Precompile\precompile.exe
  5. SET DLL_NAME=ProtoCoreData.dll
  6. SET DOT_NET_VER=v2.0.50727
  7. SET CSC_MAKE=C:\Windows\Microsoft.NET\Framework\%DOT_NET_VER%\csc.exe
  8. set proto=login.proto
  9. %tool%\protogen.exe -i:%proto% -o:%proto%.cs -ns:MyProto
  10. %CSC_MAKE% /r:%BASE_DIR%\unity\protobuf-net.dll /out:%DLL_NAME% /target:library *.cs
  11. %BASE_DIR%%PROTO_PER_COMPILE_BIN% %DLL_NAME% -o:Serialzer_%DLL_NAME% -p:%BASE_DIR%\unity\ -t:ProtobufSerializer
  12. pause

3.  双击 ProtoTools.bat 文件 按 Enter 键 生成 ProtoCoreData.dll 和 Serialzer_ProtoCoreData.dll 文件(如果出现了错误 对比一下 上面bat文件中的 SET DOT_NET_VER=v2.0.50727 的版本号是否是 v2.0.50727,若不同就输入 cmd窗口上显示的版本号)

 

第五步: 在Unity里使用Protobuf

1. 把生成出来的 ProtoCoreData.dll 和 Serialzer_ProtoCoreData.dll 文件 拷贝到 Unity工程 Assets/Plugins/protobuf 目录下

2. 把在 login.proto 同目录下的 unity文件夹 里面 找到 protobuf-net.dll 文件 然后拷贝到 Unity工程 Assets/Plugins/protobuf 目录下

3. 创建CS代码 并 运行

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. public class TestProto : MonoBehaviour {
  6. ProtobufSerializer serializer = new ProtobufSerializer();
  7. // Use this for initialization
  8. void Start () {
  9. MyProto.LoginInfo req = new MyProto.LoginInfo();
  10. MyProto.PlayerInfo playerInfo = new MyProto.PlayerInfo();
  11. playerInfo.name = "哈哈";
  12. req.playerInfo = playerInfo;
  13. //此 二进制串用于 与 服务器交互
  14. byte[] data = SerializeProto(req);
  15. //用于 读取 服务器发过来的数据
  16. MyProto.LoginInfo proto = DeSerializeProto(data, typeof(MyProto.LoginInfo)) as MyProto.LoginInfo;
  17. Debug.Log(proto.playerInfo.name);
  18. }
  19. //序列化
  20. byte[] SerializeProto(ProtoBuf.IExtensible proto)
  21. {
  22. byte[] data = null;
  23. using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
  24. {
  25. serializer.Serialize(ms, proto);
  26. if (ms.Length > 0)
  27. {
  28. data = new byte[(int)ms.Length];
  29. ms.Seek(0, System.IO.SeekOrigin.Begin);
  30. ms.Read(data, 0, data.Length);
  31. }
  32. ms.Close();
  33. }
  34. return data;
  35. }
  36. //反序列化
  37. ProtoBuf.IExtensible DeSerializeProto(byte[] data, Type type)
  38. {
  39. ProtoBuf.IExtensible proto = null;
  40. using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
  41. {
  42. ms.Write(data, 0, data.Length);
  43. ms.Seek(0, System.IO.SeekOrigin.Begin);
  44. proto = serializer.Deserialize(ms, null, type) as ProtoBuf.IExtensible;
  45. ms.Close();
  46. }
  47. return proto;
  48. }
  49. // Update is called once per frame
  50. void Update () {
  51. }
  52. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号