zoukankan      html  css  js  c++  java
  • SerializeField和Serializable

    移步:http://www.cnblogs.com/oldman/articles/2409523.html

    Unity3D 中提供了非常方便的功能可以帮助用户将Member Data在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]
    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]
    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;

    在GUI将会显示为: My Foo Bar

  • 相关阅读:
    JSON格式解析和libjson使用简介(关于cjson的使用示例)
    我还没死!!微信公众号——自媒体的营销之路
    android应用开发-从设计到实现 3-4 静态原型的状态栏
    一种绝对提高开发水平的方法
    年近30------职业回想与思考
    LeetCode Populating Next Right Pointers in Each Node
    uploadify在火狐下上传不了的解决方式,java版(Spring+SpringMVC+MyBatis)具体解决方式
    struct和typedef struct
    奔五的人学ios:swift竟然没有字符串包括,找个简单的解决方法
    Floyd算法解说
  • 原文地址:https://www.cnblogs.com/slysky/p/5091696.html
Copyright © 2011-2022 走看看