#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 项目中的序列化数据。它能帮助开发者在项目维护和升级过程中保持数据一致性。