您的位置:首页 > 移动开发 > Unity3D

Unity Protobuf的简单使用

2020-02-02 11:54 3427 查看

刚开始学习使用Protobuf,用于记录学习过程中遇见的问题,各位高手如果发现存在的问题敬请指出!
 

Unity版本:2018.3.4f1 Protobuf地址:GitHub地址 Protoc编译工具版本:protoc-3.8.0-win64 Protoc编译工具下载地址:GitHub地址 或者 https://repo1.maven.org/maven2/com/google/protobuf/protoc/

一、准备工作

  1. 下载
    protoc
    编译工具和
    protobuf
    的源代码到本地
  2. 使用VS2017或者以上版本的VS打开
    protobuf\csharp\src\Google.Protobuf.sln
    解决方案,在打开解决方案之后可能会遇见下列问题,如果没有遇见问题可以直接跳过这一段
    2.1、在生成解决方案的时候,报错
    The current .NET SDK does not support targeting .NET Core 2.1. Either target
    ,这个是因为本地没有安装
    .NET Core
    或者版本与 protobuf所需要的版本不一致,检测方法就是找到下载的protobuf源码文件夹,在protobuf文件夹的根目录下有一个
    global.json
    文件,根据该文件中的版本去下载
    .NET Core
    (地址:.NET Core),最好将32位和64位都安装上防止再出现其他问题(至于单装一个是否会出现问题,本人则没有测试过)
  3. 将编译解决方案之后生成的
    dll
    文件拷贝到Unity中的
    Plugins
    文件夹下,至于
    dll
    的位置:
    protobuf\csharp\src\Google.Protobuf\bin\Release\net45

  4. 在文本文件中按照protobuf语法格式进行相应的编写,并将文件的后缀以
    .proto
    进行保存

二、编译生成

      关于proto文件的编译方式则有两种,效果一样,可以根据自己的喜欢选择使用。

1、protoc --proto_path=

./proto/ Demo.proto UserInfo.proto
--csharp_out
=
./cs/

第一个参数:保存proto文件的位置,该位置可以自行添加,有一点需要格外注意,那就是在第二个
/
后面需要添加一个空格,不然会报错,错误看下图


第二个参数:想要输出的语言类型,因为是结合Unity使用的,所以使用的是 csharp_out,其他的类型可以自行查阅protobuf官网上的设定
第三个参数:文件的输出路径,自行设定

2、protoc -I=

F:\ProtocolBuffers\protoc-3.8.0-win64\bin\
--csharp_out
=
F:\ProtocolBuffers\protoc-3.8.0-win64\bin\cs\
F:\ProtocolBuffers\protoc-3.8.0-win64\bin\proto\Demo.proto F:\ProtocolBuffers\protoc-3.8.0-win64\bin\proto\UserInfo.proto

第一个参数:protoc.exe所在的路径
第二个参数:上面已经讲过不再描述
第三个参数:输出文件的保存位置
第四个参数:需要编译的proto文件,如果有多个文件,中间用空格隔开

三、使用

  1. 将编译后的
    UserInfo.cs
    文件拷贝到Unity中
  2. 在Unity中创建一个
    Demo.cs
    ,用于进行简单的使用,代码如下:
using Google.Protobuf;
using Protobuf;
using UnityEngine;
using UnityEngine.UI;

public class Demo : MonoBehaviour
{
public Text m_ShowMessage;

// Start is called before the first frame update
void Start()
{
ProtobufAnalysis();
}

// Update is called once per frame
void Update()
{

}

void ProtobufAnalysis()
{
UserInfo info = new UserInfo();
info.UID = 120;
info.ULevel = 100;
info.UName = "Protobuf";
info.UDescribe = "攻城狮";

byte[] data = info.ToByteArray();

//将字节数据还原到对象
IMessage message = new UserInfo();
UserInfo user = (UserInfo)message.Descriptor.Parser.ParseFrom(data);

m_ShowMessage.text = "编号:" + user.UID + "   等级:" + user.ULevel + "  名称:" + user.UName + "  职业:" + user.UDescribe;
}
}
  1. 需要注意命名空间的引入:一个就是要引入
    using Google.Protobuf;
    ,还有一个是编译后的cs文件中的命名空间,如
    UserInfo.cs
    的命名空间
    Protobuf

  • 点赞
  • 收藏
  • 分享
  • 文章举报
Shine天涯 发布了3 篇原创文章 · 获赞 0 · 访问量 555 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: