2.6 KiB
#unity/日常积累
[FormerlySerializedAs]
是 Unity 中用于 序列化字段重命名 的特性(attribute),适用于 Unity 的序列化系统。当你在 Unity 项目中更改了某个字段的名称,但不希望丢失旧的序列化数据时,你可以使用这个特性将字段标记为以前使用的名称。
使用场景:
-
字段重命名:当你在脚本中重命名了一个字段,而之前的场景、Prefab 或 ScriptableObject 已经存储了这个字段的值。如果不使用
FormerlySerializedAs
,重命名字段后,旧的序列化数据会丢失,因为 Unity 将视其为一个新的字段。 -
保持数据一致性:使用
FormerlySerializedAs
能让 Unity 在读取旧的序列化数据时识别出这个字段的旧名字,并将数据映射到新的字段上,从而避免数据丢失。
使用示例:
假设你有一个类如下:
public class PlayerStats : MonoBehaviour
{
public int health; // 旧的字段名称
}
后来你想把 health
改为 playerHealth
,但你不希望丢失已经存储在场景或对象中的数据,你可以这样做:
using UnityEngine;
using UnityEngine.Serialization;
public class PlayerStats : MonoBehaviour
{
[FormerlySerializedAs("health")] // 标记旧的字段名称
public int playerHealth; // 新的字段名称
}
解释:
[FormerlySerializedAs("health")]
告诉 Unity,这个playerHealth
字段以前被称作health
。因此,Unity 在加载旧的序列化数据时,会将health
的值赋给playerHealth
。
注意事项:
-
只能应用于序列化字段:该特性仅适用于 Unity 能够序列化的字段,例如
public
字段或标记为[SerializeField]
的私有字段。 -
只能用于重命名字段:它只用于字段重命名时的数据迁移。如果你改变了字段的类型,或者它不再是序列化的字段,这个特性不会起作用。
-
多次使用:你可以多次使用该特性来迁移数据。如果你重命名了字段多次,你可以链式地使用多个
FormerlySerializedAs
标签来处理每个阶段的字段名称变化。例如:
[FormerlySerializedAs("health")]
[FormerlySerializedAs("playerHealth")]
public int currentHealth;
在这个例子中,Unity 将 health
和 playerHealth
的旧数据映射到 currentHealth
字段上。
总结:
[FormerlySerializedAs]
是一个非常有用的工具,用于确保在重命名字段时不会丢失 Unity 项目中的序列化数据。它能帮助开发者在项目维护和升级过程中保持数据一致性。