猿问

System.Serializable在Unity中的List <MyClass>上不起作用?

我正在创建一个Loot系统。我几乎快结束了,只剩下DropTable在Enemy脚本中的Inspector中填写了。由于某种原因,我的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()方法。但是,如果那是唯一的方法,那么我想它必须这样做。在这个问题上的任何帮助将不胜感激。


慕丝7291255
浏览 266回答 2
2回答

Helenr

Unity将序列化字段,而不是属性。可以切换到以下字段:[Serializable]public class LootDrop{&nbsp; &nbsp; public int Chance;}或使用序列化的后备字段:[Serializable]public class LootDrop{&nbsp; &nbsp; public int Chance&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; get { return _chance; }&nbsp; &nbsp; &nbsp; &nbsp; set { _chance = value; }&nbsp; &nbsp; }&nbsp; &nbsp; [SerializeField]&nbsp; &nbsp; private int _chance;}

慕侠2389804

您应loot在尝试添加项目之前初始化变量。[System.Serializable]public class DropTable{&nbsp; &nbsp; public List<LootDrop> Loot;&nbsp; &nbsp; public DropTable()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Loot = new List<LootDrop>();&nbsp; &nbsp; }}另外,请谨慎使用名称约定。
随时随地看视频慕课网APP
我要回答