System.Serializable无法在Unity中的List <myclass>上工作?

时间:2018-05-01 15:24:13

标签: c# unity3d serialization

我正在创建一个Loot系统。我离开的最近几乎就是在DropTable脚本上填写检查器中的Enemy。出于某种原因,我的DropTable脚本正在序列化,但我的LootDrop类不是。我的课程基本上是这样设置的:

DropTable上课:

[System.Serializable]
public class DropTable
{
 public List<LootDrop> loot = new List<LootDrop>();

 public Item GetDrop()
 {
    int roll = Random.Range(0, 101);
    int chanceSum = 0;
    foreach (LootDrop drop in loot)
    {
        chanceSum += drop.Chance;
        if (roll < chanceSum)
        {
            return ItemDatabase.Instance.GetItem(drop.itemSlug); //return the item here
        }
    }
        return null; //Didn't get anything from the roll
 }
}

LootDrop上课:

[System.Serializable]
public class LootDrop
{
    public string itemSlug { get; set; }
    public int Chance { get; set; }
}

基本上,我的DropTable只包含LootDrop列表。但是,我无法从检查器访问LootDrop内的各个List<LootDrop>实例。我正在做的就是在我的public DropTable脚本上创建一个Enemy变量。我觉得我之前做过类似的事,没有问题。我在这里做错了吗?我真的希望DropTable成为与敌人分开的一个类,因为敌人不应该真正关心GetDrop()方法。但是,如果这是唯一的方式,那么我猜它必须这样做。任何有关此事的帮助将不胜感激。

inspector

2 个答案:

答案 0 :(得分:4)

Unity将序列化字段,而不是属性。切换到字段:

[Serializable]
public class LootDrop
{
    public int Chance;
}

或使用序列化后备字段:

[Serializable]
public class LootDrop
{
    public int Chance
    {
        get { return _chance; }
        set { _chance = value; }
    }

    [SerializeField]
    private int _chance;
}

答案 1 :(得分:0)

在尝试添加项目之前,您应该初始化F变量。

loot

另外,请注意名称约定。