Unity3D 中 protobuf-net
来源:互联网 发布:js教程 编辑:程序博客网 时间:2024/04/29 06:19
本节主要写一下在unity中是怎样用protobuf-net 来序列化和反序列化数据的
我上传了protobuf-net 地址
http://download.csdn.net/detail/jk823394954/9026241
也可以从http://code.google.com/p/protobuf/ 下载最新的protobuf-net
protobuf-net下载后的目录如下图
进入ProtoGen 中建一个记事本叫做Role.proto的文件,记住把记事本的后缀改成.proto
Role.proto中的内容如下
// 技能信息message VO_Skill{required int32 skillGroupId = 1; // 技能idrequired int32 level = 2; // 技能等级}// 玩家信息消息message CS_RoleInfo{required int32 playerId = 1; // 角色idrepeated VO_Skill skills = 2; // 技能组}
其中字段message 你可以理解成c#中的类class ,VO_Skill 和 CS_RoleInfo均为类名
字段 required标示该字段是必须的,既实例化该类时必须对该字段赋值
字段 repeated标示该字段是可以重复的,repeated VO_Skill skills 你可以理解成 List<VO_Skill>VO_Skill skills
下一步是把Role.proto文件转化成.cs文件
打开cmd命令行 进入 ProtoGen这个目录下我的是放在桌面了,所以如下图
然后按下面的格式输入内容
protogen -i:Test1.proto -i:Test2.proto -i:Test3.proto -o:Output.cs -ns:com.fbmly.model
-i 是输入文件,可以有多个
-o 输出的cs文件, 只能有一个..如果-i有多个 会将所有的代码生成到这一个cs文件当中
-ns 命名空间 最好使用,如果不使用每次生成的默认命名空间是proto的文件名。
比如 我输入的是protogen -i:Role.proto -o:Output.cs -ns:com.yyq.model
按下回车键 我们就发现在ProtoGen这个目录下多了一个Output.cs的文件
下面就是把Output.cs文件生成dll
打开unity3d自带的编译器MonoDevelop,创建c#的 Library工程 如下图
删除系统生成的MyClass.cs文件,把刚才生成的Output.cs文件加载进来
下面引入protobuf-net.dll库
在References右键 选择 Edit References如下图
选择.Net Assembly 找到CpreOnly/ios 目录 会看到 有一个 protobuf-net.dll库 ,双击它 在右面看到有这个就可以了,然后点击Ok
然后选择Build-->Build All ,会看到窗口中显示Build successful 就是成功了、
因为我的工程叫做Protobuf-NetTest 所以这时会在工程下看到有一个Protobuf-NetTest.dll
这个裤中有咱们的数据结构 既 VO_Skill 和 CS_RoleInfo类
下面就是把这个Protobuf-NetTest.dll 生成专门序列化的库
预编译要使用到的库为precompile.dll 在Precompile目录下
因为我的Protobuf-NetTest.dll是生成在 bin\Release目录下的,所以在刚才的工程的bin\Release目录下建造一个批处理文件project.bat
project.bat中的内容如下
C:\Users\jk\Desktop\proto_net\Precompile\precompile Protobuf-NetTest.dll -o:ProtobufSerializer.dll -t:com.yyq.model.ProtoSerializer
其中 Protobuf-NetTest.dll 是上一步生成的dll的名字,ProtobufSerializer.dll是将要生成的序列化的库名字,com.yyq.model.ProtobufSerializer是命名空间
双击project.bat即可看到多了一个ProtobufSerializer.dll库文件,该库就是序列化的库
在unity3d中使用
我们在unity的Assets下建个名字叫ProtoBuf的文件夹,把上一步生成的Protobuf-NetTest.dll ,ProtobufSerializer.dl 和 protobuf-net.dll复制到该文件夹下
我们在unity的Assets下建个名字叫Scripts的文件夹,建一个叫做ProtoTest.cs的文件
文件引用部分如下
using UnityEngine;using System.Collections;using System.Collections.Generic;using System.IO;using com.yyq.model;
其中using com.yyq.model; 是我们自己的命名空间
全局变量的声明 和初始化 如下
public static ProtoSerializer serializer; List<VO_Skill> sList = new List<VO_Skill>(); MemoryStream ms = new MemoryStream(); void Start () { serializer = new ProtoSerializer(); }
然后写两个函数 序列化的函数 Serialize() 和 反序列化的函数 Deserialize()
序列化的函数 Serialize()
public void Serialize() { VO_Skill s1 = new VO_Skill(); s1.skillGroupId = 1; s1.level = 2; VO_Skill s2 = new VO_Skill(); s2.skillGroupId = 3; s2.level = 4; sList.Add(s1); sList.Add(s2); CS_RoleInfo roleInfo = new CS_RoleInfo(); roleInfo.playerId = 888; roleInfo.skills.AddRange(sList); serializer.Serialize(ms, roleInfo); }
反序列化的函数 Deserialize()
public void Deserialize() { CS_RoleInfo roleInfo = new CS_RoleInfo(); ms.Position = 0; object roleInfoObj = serializer.Deserialize(ms, null, typeof(CS_RoleInfo)); roleInfo = roleInfoObj as CS_RoleInfo; Debug.Log("roleInfo.playerId " + roleInfo.playerId); foreach (VO_Skill skill in roleInfo.skills) { Debug.Log("skill.skillGroupId " + skill.skillGroupId + " skill.level " + skill.level); } }
我们在unity场景中放两个按钮,名字分别叫做 Serialize 和 Deserialize,其中按钮Serialize的点击事件 调用函数 Serialize(),按钮Deserialize的点击事件调用函数 Deserialize()
我们先点击Serialize 按钮,再点击Deserialize 按钮,则在控制台会看到输出
这正是我们所需要的数据
- Unity3D 中 protobuf-net
- Unity3D中使用protobuf
- Unity3d protobuf-net的使用
- Unity3D传递ProtoBuf-net消息测试
- Unity3D传递ProtoBuf-net消息测试
- [Unity3D]简单使用Protobuf-net(一)
- [Unity3D]简单使用Protobuf-net(二)
- [Unity3D]简单使用Protobuf-net(三)
- [Unity3D]简单使用Protobuf-net(一)
- [Unity3D]简单使用Protobuf-net(二)
- [Unity3D]简单使用Protobuf-net(三)
- Unity3D protobuf-net使用方式 (源码方式)
- [Unity3D]简单使用Protobuf-net(一)
- [Unity3D]简单使用Protobuf-net(二)
- [Unity3D]简单使用Protobuf-net(三)
- Unity3D Protobuf-net实际操作教程一
- Protobuf-net 在Unity3D中使用的小技巧 (解决JIT错误)
- Unity中使用Protobuf-net
- Oracle调整内存超出限制出现ORA-27100: shared memory realm already exists问题解决办法
- 从数据十戒中领悟的那些
- 如何安装及使用PuTTY
- niu B快速开发工具简介
- java内存结构(运行时数据区域)
- Unity3D 中 protobuf-net
- 设计模式之观察者模式
- leetcode 143: Reordered List
- 迷茫中的启蒙之路(特别适合有心无力的小白,站长推荐)
- shell脚本那点事儿(1-2)
- uva 10915 - War on Weather(几何)
- Vijos P1045Kerry 的电缆网络
- ubuntu14.04 LTS 问题汇总
- UOJ#67 新年的毒瘤(Tarjan算法求割点)