【译】对序列化的字段进行重命名

发表于2016-03-16
评论0 3.2k浏览

 

原文地址:http://blogs.unity3d.com/2015/02/03/renaming-serialized-fields/

原文作者未做版权声明,视为共享知识产权进入公共领域,自动获得授权

也许你们中的部分人知道,我们用脚本构建我们大部分的新UI系统。这意味着我们会面对用户在开发unity系统和扩展编辑器时候遇到的大部分问题。通过开发,我们修复了我们遇到的那些问题,今天我们将重点讲解其中的一个。

我们面临的一个问题是我们在不丢失用户数据的情况重命名字段,这样他们继续测试每一个新版本而无须担心数据丢失和包损坏。为了解决这个问题,我们引入了

 [FormerlySerializedAs] 属性。

你能用它做什么?让我们来看一些例子

变量重命名

假设你有如下类:

1

2

3

4

5

6

 

using UnityEngine;

class MyClass : MonoBehaviour

{

    [SerializeField]

    private string m_MyVariable;

}

 

但是你把 m_MyVariable 重命名为别的比如 m_ABetterName,但是你不想让你的用户重新对用到这个MonoBehaviour 的场景或者预制件重新填充数据。你可以通过下面这种方法来完成:

1

2

3

4

5

6

7

8

 

using UnityEngine;

using UnityEngine.Serialization;

class MyClass : MonoBehaviour

{

    [FormerlySerializedAs("m_MyVariable")]

    [SerializeField]

    private string m_ABetterName;

}

 

封装公开API

在下面情况里,你在你的API有一个共有字段。但是想把它封装在一个访问器里。所以让我们假设你有一个像这样的MyClass

1

2

3

4

5

 

using UnityEngine;

class MyClass : MonoBehaviour

{

    public string myValue;

}

 

如果想把这个值封装在访问器里但是又不想丢失任何已有数据,你可以这样做:

1

2

3

4

5

6

7

8

9

10

11

12

13

 

using UnityEngine;

using UnityEngine.Serialization;

class MyClass : MonoBehaviour

{

    [FormerlySerializedAs("myValue")]

    [SerializeField]

    private string m_Value;

    public string myValue

    {

        get { return m_Value; }

        set { m_Value = value; }

    }

}

 

多次重命名

 

多次重命名字段是支持的,仅仅多次加这个属性就好了,一个对应这个字段的一个过去的名字。

1

2

3

4

5

6

7

8

9

 

using UnityEngine;

using UnityEngine.Serialization;

class MyClass : MonoBehaviour

{

    [FormerlySerializedAs("m_MyVariable")]

    [FormerlySerializedAs("m_ABetterName")]

    [SerializeField]

    private string m_EvenBetterName;

}

 

什么时候我可以移除这个属性?

 

在你重命名并重新保存你的场景和资源以后,你可以移除这个属性、当然这意味你能控制用户。对于一些像资源商店发布者的情况,这种控制是不可能。所以在这种情况下,你必须一直保有它以确保使用它的用户可以升级到新版本而不会丢失数据。

 

希望这个小功能能对你有帮助!

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引