Unity中使用Protobuf-net
2016-02-04 14:20
465 查看
使用Protobuf的好处我就不说了,这里强调使用。(目前我认为是为了实现C++服务器与unity的C#之间的跨平台通信)
首先从gitHub上下载源码 https://github.com/mgravell/protobuf-net
然后进入如下目录下
点击.csproj,进入工程 编译一下,得到如下图:
把protobuf-net.dll加入到
打开该目录下的.csproj,进入工程 编译一下 ,进入如下目录
在该目录下有一个.proto文件 我们的目的是将.proto文件转化为.cs文件
写一个批处理 创建一个xx.Bat批处理
内容:
@echo off
rem 查找文件
for /f "delims=" %%i in ('dir /b ".\*.proto"') do echo %%i
rem 转cpp for /f "delims=" %%i in ('dir /b/a "*.proto"') do protoc -I=. --cpp_out=. %%i
for /f "delims=" %%i in ('dir /b/a "*.proto"') do protogen -i:%%i -o:%%~ni.cs
pause
然后点击xx.Bat 可以批处理文件夹下的.proto文件转化为.cs 然后可以看见文件夹下有生成的.cs文件
现在我们来自己写一个
然后点击xx.Bat 就生成了我们想要的
接着在Asset目录下创建smcs.rsp
内容为:
-unsafe
然后把你生成的.cs文件放入 就OK了
首先从gitHub上下载源码 https://github.com/mgravell/protobuf-net
然后进入如下目录下
点击.csproj,进入工程 编译一下,得到如下图:
把protobuf-net.dll加入到
打开该目录下的.csproj,进入工程 编译一下 ,进入如下目录
在该目录下有一个.proto文件 我们的目的是将.proto文件转化为.cs文件
写一个批处理 创建一个xx.Bat批处理
内容:
@echo off
rem 查找文件
for /f "delims=" %%i in ('dir /b ".\*.proto"') do echo %%i
rem 转cpp for /f "delims=" %%i in ('dir /b/a "*.proto"') do protoc -I=. --cpp_out=. %%i
for /f "delims=" %%i in ('dir /b/a "*.proto"') do protogen -i:%%i -o:%%~ni.cs
pause
然后点击xx.Bat 可以批处理文件夹下的.proto文件转化为.cs 然后可以看见文件夹下有生成的.cs文件
现在我们来自己写一个
message Person { required string name=1; required int32 id=2; optional string email=3; enum PhoneType { MOBILE=0; HOME=1; WORK=2; } message PhoneNumber { required string number=1; optional PhoneType type=2 [default=HOME]; } repeated PhoneNumber phone=4; }requied是必须有的字段、optional是可有可无的字段、repeated是可以重复的字段(数组或列表),同时枚举字段都必须给出默认值。
然后点击xx.Bat 就生成了我们想要的
//------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool. // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ // Generated from: msg.proto namespace msg { [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"Person")] public partial class Person : global::ProtoBuf.IExtensible { public Person() {} private string _name; [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"name", DataFormat = global::ProtoBuf.DataFormat.Default)] public string name { get { return _name; } set { _name = value; } } private int _id; [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"id", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)] public int id { get { return _id; } set { _id = value; } } private string _email = ""; [global::ProtoBuf.ProtoMember(3, IsRequired = false, Name=@"email", DataFormat = global::ProtoBuf.DataFormat.Default)] [global::System.ComponentModel.DefaultValue("")] public string email { get { return _email; } set { _email = value; } } private readonly global::System.Collections.Generic.List<Person.PhoneNumber> _phone = new global::System.Collections.Generic.List<Person.PhoneNumber>(); [global::ProtoBuf.ProtoMember(4, Name=@"phone", DataFormat = global::ProtoBuf.DataFormat.Default)] public global::System.Collections.Generic.List<Person.PhoneNumber> phone { get { return _phone; } } [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"PhoneNumber")] public partial class PhoneNumber : global::ProtoBuf.IExtensible { public PhoneNumber() {} private string _number; [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"number", DataFormat = global::ProtoBuf.DataFormat.Default)] public string number { get { return _number; } set { _number = value; } } private Person.PhoneType _type = Person.PhoneType.HOME; [global::ProtoBuf.ProtoMember(2, IsRequired = false, Name=@"type", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)] [global::System.ComponentModel.DefaultValue(Person.PhoneType.HOME)] public Person.PhoneType type { get { return _type; } set { _type = value; } } private global::ProtoBuf.IExtension extensionObject; global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); } } [global::ProtoBuf.ProtoContract(Name=@"PhoneType")] public enum PhoneType { [global::ProtoBuf.ProtoEnum(Name=@"MOBILE", Value=0)] MOBILE = 0, [global::ProtoBuf.ProtoEnum(Name=@"HOME", Value=1)] HOME = 1, [global::ProtoBuf.ProtoEnum(Name=@"WORK", Value=2)] WORK = 2 } private global::ProtoBuf.IExtension extensionObject; global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); } } }接下来要在Unity中应用 还应该把protobuf-net的源码放入Plugins
接着在Asset目录下创建smcs.rsp
内容为:
-unsafe
然后把你生成的.cs文件放入 就OK了
相关文章推荐
- Unity访问Access数据库
- Unity访问Access数据库
- wiki/Cg Programming/Unity_shder/Minimal Shader
- unity3D中使用Socket进行数据通信(一)
- wiki/Cg Programming/Unity/shder_理解准备
- 猫都能学会的Unity3D Shader入门指南(二)
- 猫都能学会的Unity3D Shader入门指南(一)
- Unity 手柄/键盘映射
- Unity 2D场景缩放
- Unity5.0 RPG角色扮演历险类游戏之 森林历险记
- Unity3D游戏开发之小地图的实现
- 测试-Unity组件的调用顺序
- Unity Coroutines
- 用Unity3d的maxtrix实现的WolrdToScreen
- unity5中AssetBundle相关
- Unity Android 阴影不显示、阴影显示不正确 解决备忘
- Unity3d之Shader学习资料整理
- Unity ShaderLab学习总结
- unity3D学习
- Unity3D 商店下载的package存放位置