Unity3D中使用Protobuf-net

关于使用Protobuf的好处本篇文章就不做介绍了,考虑到Protobuf不支持.Net3.5及以下版本,所以如果想在Unity3D中使用,则需要用到第三方的Protobuf-net库。

首先从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了

发布了6 篇原创文章 · 获赞 43 · 访问量 57万+

猜你喜欢

转载自blog.csdn.net/hany3000/article/details/83643612