查看: 1071|回复: 2
打印 上一主题 下一主题

[其他] 用户变量Member Data序列化Serialize

[复制链接]

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-8-30 01:54:45 |只看该作者 |倒序浏览

[color=rgb(85, 85, 85) !important]unity3d可以将在Inspector中显示,并且定义Serialize关系。简单的说,在没有自定义Inspector的情况下所有显示在Inspector 中的属性都同时具有Serialize功能。就是你在Inspector看到什么,保存游戏的时候,这些值就会被保存成二进制文件。
可被Serialize的变量的定义方法
1. public 变量
在没有加入任何Attribute的前提下,public变量是默认被视为可以被Serialize的。
2. [SerializeField] Attribute
有时候我们需要Serialize一份private或者protected数据段,这个时候可以使用[SerializeField]这个Attribute:
[SerializeField] protected int foobar = 0;
注意: 这样定义出的成员变量是会在Inspector中显示出来。
3. 单独的class或struct
有时候我们会自定义一些单独的class/struct, 由于这些类并没有从 MonoBehavior 派生所以默认并不被Unity3D识别为可以Serialize的结构。自然也就不会在Inspector中显示。我们可以通过添加 [System.Serializable]这个Attribute使Unity3D检测并注册这些类为可Serialize的类型。具体做法如下:
[System.Serializable]
[code]phpcode:public class FooBar {    public int foo = 5;    public int bar = 10;}


4. ScriptableObject
ScriptableObject 是Unity3D提供的一种特殊的处理数据存储的方法,具体请参考ScriptableObject
NonSerialize的变量的定义方法
1. protected, private, internal 变量
默认情况下,protected, private, internal变量将不会被serialize.
2. [System.NonSerialized] Attribute
有时候我们需要定义一些public变量方便操作,但是又不希望这些变量保留。这个时候可以利用[System.NonSerialized]来完成这个操作:
[System.NonSerialized] public float foobar = 1.0f;
3. readonly, const, static 修饰符
如果变量加入了readonly, const, static等修饰符,无论他的serialize设置如何,都将不会进行serialize
4. Dictionary<T,K>
Unity3D可以对List<T>进行序列化显示,但是由于程序员偷懒或不够强大,以至于我们到现在都不能serialize Dictionary<T,K>这么一个较为常用的类型。通常我们会通过Serialize一份List<T>,然后在 Awake中初始化Dictionary的方法来完成Dictionary的serialize操作。如:
[System.Serializable]
[code]phpcode:public class NameToID {    public string name = "";    public int ID = -1;}public List<NameToID> nameToIDList = new List<NameToID>(); Dictionary<string,int> nameToID = new Dictionary<string,int>(); //void Awake () {    foreach ( NameToID info in nameToIDList ) {        nameToID[info.name] = info.ID;    }    nameToIDList = null; // put it null make garbage collect it (I wish)}


Inspector中的显示
变量在Inspector中会根据变量的大写字母来隔开来显示,并且会将首字母强制大写的方式显示。 如:
public int myFooBar = 0;

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-8-30 03:17:14 |只看该作者
Good stuff !
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-9-24 07:15 , Processed in 0.085769 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部