Skip to content

Unity 序列化与 Inspector

unity-serialization-inspector-system

核心理解

序列化:Unity 把字段数据保存到 ScenePrefabAsset 里。 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;

参考链接

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0