obsidian/笔记文件/2.笔记/FormerlySerializedAs.md
2025-03-26 00:02:56 +08:00

2.6 KiB
Raw Blame History

#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

注意事项:

  1. 只能应用于序列化字段:该特性仅适用于 Unity 能够序列化的字段,例如 public 字段或标记为 [SerializeField] 的私有字段。

  2. 只能用于重命名字段:它只用于字段重命名时的数据迁移。如果你改变了字段的类型,或者它不再是序列化的字段,这个特性不会起作用。

  3. 多次使用:你可以多次使用该特性来迁移数据。如果你重命名了字段多次,你可以链式地使用多个 FormerlySerializedAs 标签来处理每个阶段的字段名称变化。例如:

[FormerlySerializedAs("health")]
[FormerlySerializedAs("playerHealth")]
public int currentHealth;

在这个例子中Unity 将 healthplayerHealth 的旧数据映射到 currentHealth 字段上。


总结:

[FormerlySerializedAs] 是一个非常有用的工具,用于确保在重命名字段时不会丢失 Unity 项目中的序列化数据。它能帮助开发者在项目维护和升级过程中保持数据一致性。