You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动