Хранение GameObjects в массивах в списке пользовательских классов - Unity3D и C # - PullRequest
0 голосов
/ 25 декабря 2018

Я имею в виду создание списка пользовательских классов, содержащих префаб препятствий, в котором будет храниться около 5 экземпляров каждого типа препятствий.Таким образом, список будет выглядеть примерно так:

Obstacle Type [0] ------> [0] Instance 1
                          [1] Instance 2
                          [2] Instance 3...

Obstacle Type [1] ------> [0] Instance 1
                          [1] Instance 2
                          [2] Instance 3...

В настоящее время я программирую 3D Runner Game на Unity3D и программирую скрипт Obstacle Generator.Сначала я начал с List>, но обнаружил, что создание пользовательского класса было бы лучше.Поэтому я создал собственный класс ObstacleSpawned, который включает в себя GameObject [], который должен включать в себя экземпляры препятствий такого типа, но у меня исключение нулевой ссылки на

obsItem.spawnedObstacles.Add (obstacle);

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

print (obsItem.spawnedObstacles);

, которое я не знаю, как решить.Я даже не знаю, будет ли работать код или нет.

[Serializable]
public class ObstacleTypes {
    public GameObject prefab;
    public string name;
}

[Serializable]
public class ObstacleSpawned {
    public List<GameObject> spawnedObstacles = new List<GameObject>();
}

public class ObstacleGenerator : MonoBehaviour {

    // variables
    public ObstacleTypes[] obstacles;
    public List<ObstacleSpawned> obstaclesSpawned = new List<ObstacleSpawned> ();

    [SerializeField] int numberOfInstances;

    void Awake () {
        for (int x = 0; x < numberOfInstances; x++) {
            ObstacleSpawned obsItem = null;
            for (int y = 0; y < obstacles.Length; y++) {
                GameObject obstacle = Instantiate (obstacles [y].prefab, transform) as GameObject;
                obstacle.name = obstacles [y].name;
                obstacle.SetActive (false);
                //obsItem.spawnedObstacles.Add (obstacle);
                print (obsItem.spawnedObstacles);
            }
            obstaclesSpawned.Add (obsItem);
        }
    }

}

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

1 Ответ

0 голосов
/ 25 декабря 2018

Вы устанавливаете ObstacleSpawned obsItem = null;, затем пытаетесь сослаться на свойство в obsItem, что дает вам NRE.Измените его на ObstacleSpawned obsItem = new ObstacleSpawned(); следующим образом:

void Awake () {
    for (int x = 0; x < numberOfInstances; x++) {
        ObstacleSpawned obsItem = new ObstacleSpawned();
        for (int y = 0; y < obstacles.Length; y++) {
            GameObject obstacle = Instantiate (obstacles [y].prefab, transform) as GameObject;
            obstacle.name = obstacles [y].name;
            obstacle.SetActive (false);
            //obsItem.spawnedObstacles.Add (obstacle);
            print (obsItem.spawnedObstacles);
        }
        obstaclesSpawned.Add (obsItem);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...