尧图精选

Unity 序列化系统拒绝多态继承的工程化分析

🕒 发布时间:2026/9/2 5:18:33 📁 来源:尧图网络
开场小李第一次用面向对象的方式组织 Unity 数据时,踩了一个经典坑:他定义了EnemyData基类,派生出MeleeEnemyData和RangedEnemyData,信心满满地把基类字段塞进MonoBehaviour。结果 Inspector 里只看到基类那几个字段,运行时赋进去的子类实例序列化后只剩基类布局——子类新增的字段无声无息地丢了, prefab 重载后拿到的是一个"被削成基类"的数据。那一刻他才意识到:Unity 的内联序列化和BinaryFormatter那类基于反射的 .NET 序列化有根本区别——它根本不记录运行时类型。这不是 bug,而是 Unity 为了加载性能、资产体积和编辑器稳定性做出的一整套深思熟虑的取舍。理解"为什么不支持",比死记"不支持"有用得多,因为每一条替代方案都是从这些约束里长出来的。一、Unity 序列化与多态的基本规则1.1 先搞清楚实际行为:不是报错,是静默截断Unity 内联序列化对自定义[Serializable]类采用按声明类型、按值嵌入的策略:序列化器只看字段声明的类型布局,一个萝卜一个坑地把字段值写进资产,不写入任何类型标识。由此推出三条铁律:字段声明为基类,运行时塞入子类实例:能序列化,但只按基类布局写——子类字段被静默丢弃,这是最阴险的翻车方式(不报错、不警告)。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →