一部分人可能知道,我们(unity)构建了大多数全新UI系统,并把它作为用户脚本。这表示Unity承受着大多来自我们用户界面的限制,尤其是要在Unity中开发系统并进行编辑器扩展。
我们面临的其中一个问题是如何重命名字段,而用户也不必为此丢失数据。在我们的测试期间,我们想重构代码,也用不着破坏掉我们的beta用户项目。因此,用户就能继续测试每个新版本,而不必过多担心数据丢失和项目破坏。为了解决这个问题,我给大家推荐[FormerlySerializedAs]属性。
您能做些什么?让我们看一些用例吧!
变量重命名
假设您有以下类:
你想像m_ABetterName那样,把m_MyVariable重命名。但你不想让你的用户在所有的场景或预制中,为MonoBehaviour重新填充数据。目前,你可以完成如下内容:
封装公共的API
在这种情况下,你将有个公共字段,它是你API中的一部分,但你想把它封装到访问器中。那么,我们假想有一个像这样的MyClass类:
在访问器中封装这个数值,而且在你资源中未丢失任何已存在的数据。你可以像下列代码操作:
多次重命名
支持多次重命名字段,只需多次添加属性到每个字段的曾用名中。
我何时可以删除属性呢?
完成重命名后,当你已重新保存你全部的场景和资源,就可以删除属性。当然,这一操作暗示着你已“控制”了你的用户。譬如,就像资源商城的发行商一样,这种“控制”是不可能的。因此,这种情况下你将不得不处理它,确保在任意版本中的代码,用户都可以做到随时更新,而不必丢失数据。
我们面临的其中一个问题是如何重命名字段,而用户也不必为此丢失数据。在我们的测试期间,我们想重构代码,也用不着破坏掉我们的beta用户项目。因此,用户就能继续测试每个新版本,而不必过多担心数据丢失和项目破坏。为了解决这个问题,我给大家推荐[FormerlySerializedAs]属性。
您能做些什么?让我们看一些用例吧!
变量重命名
假设您有以下类:
[C#]
纯文本查看
复制代码
1
2
3
4
5
6
|
using
UnityEngine;
class
MyClass : MonoBehaviour
{
[SerializeField]
private
string
m_MyVariable;
}
|
[C#]
纯文本查看
复制代码
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类:
[C#]
纯文本查看
复制代码
1
2
3
4
5
|
using
UnityEngine;
class
MyClass : MonoBehaviour
{
public
string
myValue;
}
|
[C#]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
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; }
}
}
|
多次重命名
支持多次重命名字段,只需多次添加属性到每个字段的曾用名中。
[C#]
纯文本查看
复制代码
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;
}
|
完成重命名后,当你已重新保存你全部的场景和资源,就可以删除属性。当然,这一操作暗示着你已“控制”了你的用户。譬如,就像资源商城的发行商一样,这种“控制”是不可能的。因此,这种情况下你将不得不处理它,确保在任意版本中的代码,用户都可以做到随时更新,而不必丢失数据。
希望这个全新小功能可以帮得上你!