转->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;
}