转->Unity3D Member data 和 Inspector,Serialize的关系

Unity3d 中提供了非常方便的功能可以帮助用户将Member Data 在Inspector 中显示,并且定义Serialize关系.简单的说,在没有自定义Inspector的情况下所有显示在Inspector中的属性都同时具有Serialize功能,换句话说,就是你在Inspector看到什么,保存游戏的时候,这些只就会被保存成二进制(有待研究)

可被Serialize的变量的定义方法.

1 public 变量

在没有加入任何Attribute的前提下,public变量是默认被视为可以被Serailize的.

2 [SerializeField] Attribute

有时候我们需要Serialize一份private或者protected数据段.这个时候可以使用[SerializeField] 这个Attribute.

3 单独的Class或者Struct

有时候我们会自定义一些单独Class/Struct 由于这些类并没有从MonoBehavior派生所以默认并不被Unity3D 识别为可以Serialize的结构.自然能也就不会在Inspector中显示.我们可以通过添加[System.Serializable] 这个Attribute是Unity3d 检测并注册这些类为可以Serialize的类型.具体做法如下:

[System.Serializeable]

public class FooBar{

public int foot=5;

public int bar=10;

}

4 ScriptableObject

ScriptableObject 是Unity3d提供的一种处理特殊数据的处理数据存储的方法,具体请参考ScriptableObject

ScriptableObject允许你存储大量用于公用的数据.可以理解为Unity的一个串行化工具,但是要和SerializableObject区分开来(只能在Editor下使用)

 

NonSerialize的变量的定义方法

1 protected,private,internal变量

默认情况下,protected,private,internal 变量将不会被Serialize.

2 [System.NonSerizlized] Attribute

有时候我们需要定义一些public变量方便操作,但是有不希望这些变量保留.这个时候可以利用这个属性来完成这个操作.

[System.NonSerialized]

public float foobar=1.0f;

3 readonly,const,static 修饰符.

如果变量加入了 readonly,const,static 这些修饰符,无论是否加Serialize属性,都将不会进行Serialize.

4 Dictionary<T,K>

unity3d 可以对List<T>进行序列化显示,但是不支持Dictionary<T,k>.通常的做法是通过Serialize一份List<T>,然后在Awake中初始化Dictionary的方法来达到目的.

[System.Serizlizable]

public class NameToID{

  public string name="";

  public int ID=-1;

}

public List<NameToID> nameToIDList=new List<NameToID>();

Dictionary<string ,int > nameToIDDic=new Dictionary<string,int>();

void Awake()

{

  foreach(NameToID info int nameToIDList)

  {

    nameToID[info.name]=info.ID;

  }

  nameToIDList=null;

}

 

posted @ 2015-09-01 17:00  我的武侠梦  阅读(297)  评论(0)    收藏  举报