Unity中List<MyClass>无法使用System.Serializable序列化问题求助
解决Unity中LootDrop类无法序列化的问题
兄弟,我遇到过一模一样的坑!Unity的自定义类序列化规则真的容易踩雷,尤其是嵌套在另一个可序列化类里的时候。你的DropTable能正常序列化,但里面的LootDrop不行,大概率是以下几个原因之一,我给你一步步排查解决:
1. 最常见的遗漏:LootDrop没加[System.Serializable]标记
Unity默认只会序列化内置类型(比如int、string、List)和显式标记了[System.Serializable]的自定义类。如果你的LootDrop没加这个特性,就算DropTable加了,里面的List<LootDrop>也没法被编辑器识别。
修复代码如下:
[System.Serializable] // 必须加这个! public class LootDrop { public Item dropItem; // 假设你的Item是自定义物品类 public int dropChance; // 比如0-100的掉落概率 // 其他你需要的字段 }
2. LootDrop包含Unity不支持序列化的字段
如果LootDrop里有以下类型的字段,Unity会直接跳过序列化:
- 静态字段(
static修饰) - 私有字段且没加
[SerializeField]标记 - 接口类型(比如
IItem而不是具体的Item类) - 字典(
Dictionary<TKey, TValue>,Unity默认不支持序列化字典) - 继承了
MonoBehaviour的类(这类必须作为组件挂在GameObject上,不能作为纯数据类序列化在列表里)
举个修复私有字段的例子:
[System.Serializable] public class LootDrop { [SerializeField] private Item _dropItem; // 私有字段加[SerializeField]才能序列化 [SerializeField] private int _dropChance; // 可以用属性对外暴露,不影响序列化 public Item DropItem => _dropItem; public int DropChance => _dropChance; }
如果你的LootDrop继承了MonoBehaviour,赶紧去掉继承!纯数据类不需要继承这个,改成普通类加[System.Serializable]就行。
3. 检查嵌套的Item类是否也能序列化
如果你的Item也是自定义类,那它同样需要加[System.Serializable]标记,否则LootDrop里的Item字段也会序列化失败,连带整个LootDrop都显示异常。
4. 编辑器缓存问题(最后一招)
如果以上都改了还是不行,大概率是Unity编辑器的缓存搞鬼:
- 先点击Unity顶部的
File -> Save Project保存所有修改 - 点击
Play按钮进入运行模式,再停止运行,触发编辑器刷新 - 极端情况可以关闭Unity,删除项目根目录下的
Library文件夹(放心,这个文件夹是自动生成的,重启Unity会重新构建),然后重新打开项目
按照上面的步骤改完,你应该就能在Enemy脚本的Inspector面板里正常填充DropTable的loot列表了!
内容的提问来源于stack exchange,提问作者Dtb49




