System.Serializable не работает со списком <MyClass>в Unity? - PullRequest
0 голосов
/ 01 мая 2018

Я в процессе создания системы лута. Я почти в конце, все, что мне осталось, это заполнить 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 голосов
/ 01 мая 2018

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;
}
0 голосов
/ 01 мая 2018

Вы должны инициализировать переменную loot, прежде чем пытаться добавить элементы.

[System.Serializable]
public class DropTable
{
    public List<LootDrop> Loot;

    public DropTable()
    {
        Loot = new List<LootDrop>();
    }
}

Кроме того, будьте осторожны с именными соглашениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...