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