Как правильно добавить объект в список, когда список является объектом пользовательского класса? - PullRequest
0 голосов
/ 27 мая 2019

Я получаю исключение нулевой ссылки, когда пытаюсь добавить регион в список и понятия не имею, что я делаю неправильно.Я просто не могу понять это, и я сделал это миллион раз.

public List<Region> regions;

public class Region
{
    public int x_size;
    public int y_size;

    public enum terrain
    {
        desert,
        lowlands,
        crater,
        city
    };

    public terrain ground;
}

private void NewRegion()
{
    Region thisRegion = new Region();
    thisRegion.x_size = Random.Range(25, 50);
    thisRegion.y_size = Random.Range(25, 50);
    thisRegion.ground = Region.terrain.desert;
    regions.Add(thisRegion);
}

Ответы [ 3 ]

2 голосов
/ 27 мая 2019

Вы просто не создали свой список Region (регионов), поэтому он пуст.Посмотрите на new List<Region>() часть:

public List<Region> regions = new List<Region>();

public class Region
{
    public int x_size;
    public int y_size;

    public enum terrain
    {
        desert,
        lowlands,
        crater,
        city
    };

    public terrain ground;
}

private void NewRegion()
{
    Region thisRegion = new Region();
    thisRegion.x_size = Random.Range(25, 50);
    thisRegion.y_size = Random.Range(25, 50);
    thisRegion.ground = Region.terrain.desert;
    regions.Add(thisRegion);
}
1 голос
/ 27 мая 2019

Список regions пуст, вы ничего не можете к нему добавить.В Start() до:

regions = new List<Region> ();
0 голосов
/ 27 мая 2019

Вы должны сделать Region a [Serilizable] type:

[Serializable]
public class Region
{
    public int x_size;
    public int y_size;

    public enum terrain
    {
        desert,
        lowlands,
        crater,
        city
    };

    public terrain ground;
}

Поскольку поле regions равно public, оно все равно будет автоматически сериализовано и инициализировано Инспектором единства , если Region был сериализуемым .

Так что теперь верхний код будет иметь два преимущества

  • Вам не нужно иметь код

    region = new List<Region>();
    

    нигде. Это будет инициировано автоматически Unity.

    Это все еще рекомендуется иметь, хотя, но я бы не сделал это в Start, а просто как

    public List<Region> regions = new List<Region>();
    
  • Другое действительно огромное преимущество заключается в том, что теперь вы действительно должны видеть этот список в Unity Inspector, чтобы вы могли непосредственно из редактора добавлять и настраивать элементы без необходимости жестко их кодировать с помощью скрипта.

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