Unity Protobuf的简单使用

刚开始学习使用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
    Google.Protobuf.dll
  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
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值