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

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 文件 并编写以下内容

message PlayerInfo
{
	optional string name = 1;
	optional string sex = 2;
}

message LoginInfo
{
	optional PlayerInfo playerInfo = 1;
	required uint32 userId = 2;
}

说明一下修饰符的意义

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

Optional:可选字段,可不赋值

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

 

第三步:生成CS

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

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

@echo off
set tool=ProtoGen

set proto=login.proto

%tool%\protogen.exe -i:%proto% -o:%proto%.cs -ns:MyProto

pause

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

 

第四步: 生成dll文件

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

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

@echo off
set tool=ProtoGen

SET BASE_DIR=%CD%
SET PROTO_PER_COMPILE_BIN=\Precompile\precompile.exe 
SET DLL_NAME=ProtoCoreData.dll
SET DOT_NET_VER=v2.0.50727
SET CSC_MAKE=C:\Windows\Microsoft.NET\Framework\%DOT_NET_VER%\csc.exe

set proto=login.proto
%tool%\protogen.exe -i:%proto% -o:%proto%.cs -ns:MyProto

%CSC_MAKE% /r:%BASE_DIR%\unity\protobuf-net.dll /out:%DLL_NAME% /target:library *.cs
%BASE_DIR%%PROTO_PER_COMPILE_BIN% %DLL_NAME% -o:Serialzer_%DLL_NAME% -p:%BASE_DIR%\unity\ -t:ProtobufSerializer

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代码 并 运行

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestProto : MonoBehaviour {

    ProtobufSerializer serializer = new ProtobufSerializer();

    // Use this for initialization
    void Start () {

        MyProto.LoginInfo req = new MyProto.LoginInfo();

        MyProto.PlayerInfo playerInfo = new MyProto.PlayerInfo();
        playerInfo.name = "哈哈";
        req.playerInfo = playerInfo;

        //此 二进制串用于 与 服务器交互
        byte[] data = SerializeProto(req);

        //用于 读取 服务器发过来的数据
        MyProto.LoginInfo proto = DeSerializeProto(data, typeof(MyProto.LoginInfo)) as MyProto.LoginInfo;
        Debug.Log(proto.playerInfo.name);
    }

    //序列化
    byte[] SerializeProto(ProtoBuf.IExtensible proto)
    {
        byte[] data = null;

        using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
        {
            serializer.Serialize(ms, proto);
            if (ms.Length > 0)
            {
                data = new byte[(int)ms.Length];
                ms.Seek(0, System.IO.SeekOrigin.Begin);
                ms.Read(data, 0, data.Length);
            }
            ms.Close();
        }
        return data;
    }

    //反序列化
    ProtoBuf.IExtensible DeSerializeProto(byte[] data, Type type)
    {
        ProtoBuf.IExtensible proto = null;
        using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
        {
            ms.Write(data, 0, data.Length);
            ms.Seek(0, System.IO.SeekOrigin.Begin);
            proto = serializer.Deserialize(ms, null, type) as ProtoBuf.IExtensible;
            ms.Close();
        }
        return proto;
    }
	
	// Update is called once per frame
	void Update () {
		
	}
}

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙笑~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值