Appearance
Unity 序列化与 Inspector
核心理解
序列化:Unity 把字段数据保存到 Scene、Prefab、Asset 里。 Inspector:把这些可序列化字段显示出来,让你在编辑器里改。
所以不是所有变量都会显示在 Inspector。Unity 主要看的是:这个字段能不能被序列化。
最常用写法
c
[SerializeField] private float moveSpeed = 5f;
public float MoveSpeed => moveSpeed;这比直接写 public float moveSpeed; 更推荐。 因为 Inspector 能调参数,但外部脚本不能随便改你的内部字段。
Unity 会序列化什么
字段满足这些条件,通常才能保存/显示:
c
public int hp;
[SerializeField] private float speed;同时它不能是:
c
static
const
readonly类型也要是 Unity 支持的,比如:
c
int, float, bool, string
Vector2, Vector3, Color, AnimationCurve
GameObject, Transform, AudioClip, Sprite
数组、List<T>
带 [Serializable] 的自定义类或结构体自定义类
c
[System.Serializable]
public class WeaponData
{
public string weaponName;
public int damage;
}
[SerializeField] private WeaponData weapon;[Serializable] 是让 Unity 知道:这个普通 C# 类里面的数据也可以保存。
SerializeReference 普通 [Serializable] 更像“按值保存”。 [SerializeReference] 更像“按引用保存”,适合多态、可空、共享同一个对象、复杂图结构。
c
[SerializeReference] private SkillEffect effect;初学阶段先少用它,等你遇到“父类字段里要放不同子类对象”时再学。
Inspector 美化属性
c
[Header("Movement")]
[Tooltip("角色每秒移动距离")]
[Range(0f, 12f)]
[SerializeField] private float moveSpeed = 5f;Header:加标题。 Tooltip:鼠标悬停说明。 Range:把数字变成滑条。 HideInInspector:保存但不显示。 FormerlySerializedAs:字段改名时保留旧 Inspector 数据。
常见坑
普通属性通常不会显示:
c
public int Hp { get; set; }Dictionary、多维数组、嵌套容器不走普通字段序列化,常用 List<Pair> 或自定义序列化处理。 运行时改 Inspector 字段,一般不会自动写回场景或 Prefab 资产。 字段改名可能导致已配置数据丢失,重构时用:
c
[FormerlySerializedAs("hitpoints")]
[SerializeField] private int health;参考链接