Считыватель строк работает только 1 раз

Я работаю над небольшим тестовым проектом, где 99,9% игры находится в коде, а 0,1% - в визуальном редакторе.

Я создаю карту тайлов для своего рода Tower Defense. каждая карта 5/5 и загружается из текстового файла в папке ресурсов

я не понимаю почему, но это работает только 1 раз. если я пытаюсь построить карту 2 или построить 1, уничтожить ее и перестроить, я получаю эту ошибку:

NullReferenceException: Ссылка на объект не установлена ​​для экземпляра объекта MapBuilder.buildMap (родительский элемент UnityEngine.GameObject, карта.Map) (в>Assets/script/MapBuilder.cs:21) Map.build (System.String _name) (в Assets/script/Map.cs:39) Main.Start () (в разделе Активы /script/Main.cs:20)

мой основной класс (на данный момент я создаю только карты для тестирования)

public class Main : MonoBehaviour {
GameObject mainObject;

Map map;
// Use this for initialization
void Start () {
    mainObject = GameObject.Find("Main");

    map = gameObject.AddComponent<Map>();

    map.build("map_start");

    GameObject map2 =  GameObject.Find("map_start1");

    Map map2C = map2.AddComponent<Map>();

    map2C.build("map_start1");
}

// Update is called once per frame
void Update () {

}
}

мой класс карты

public class Map : MonoBehaviour {

public List<GameObject> planes;

public List<List<int>> mapData;

public string mapName;


public void build(string _name)
{
    mapName = _name;
    if(planes != null)
    {
        delete();
    }
    else
    {
        planes = new List<GameObject>();

        mapData = new List<List<int>>();
    }
    MapBuilder.buildMap(gameObject, gameObject.GetComponent<Map>());

}

private void delete()
{
    for(int i = 0; i < planes.Count; i++)
    {
        Destroy(planes[i]);
    }

    mapData.Clear(); //do not clear capacity! only clear element (avoid     reallocating the memory)

    planes = new List<GameObject>();

    mapData = new List<List<int>>();
}

}

и вот часть, где у меня есть ошибка

    public const float height = -2;

public static Map buildMap(GameObject parent, Map map)
{       
    //get the stream reader ready
    FileInfo sourceFile = null;
    StringReader reader = null;

    Debug.Log(map.mapName);
    //load
    TextAsset mapDataStream = (TextAsset)Resources.Load(map.mapName,  typeof(TextAsset));
    //Debug.Log(mapDataStream.text);
    //read
    reader = new StringReader(mapDataStream.text);

    for(int x = 0; x < 5; x++)
    {
        string txt = reader.ReadLine();

        map.mapData.Add(new List<int>());

        //get height data
        for(int y = 0; y < 5; y++)
        {
            map.mapData[x].Add(0);
            map.mapData[x][y] = 49 - txt[y];

        }
    }

    mapDataStream = null;
    reader.Close();

ошибка именно в этой строке: reader = new StringReader(mapDataStream.text);

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

вот как выглядит карта

(нужно 10 репутации, чтобы встроить изображение)

я получаю данные из текстового файла, который выглядит следующим образом: 00000 11111 00000 11011 11111

и я сам создаю сетку (у примитивной плоскости есть 2 треугольника на единицу, и модификация их будет слишком много, у моей - 2 треугольника)

пока нет текстуры. это будет добавлено позже

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

Спасибо за вашу помощь

1 ответ

Решение

Если вы проверите следующую строку:

TextAsset mapDataStream = (TextAsset)Resources.Load(map.mapName, typeof(TextAsset));

Отладкой вашего кода; шаг за шагом код кода. Определите, если mapDataStream когда-либо NULL потому что, если это так, следующая строка кода будет бросать NullReferenceException потому что вы пытаетесь прочитать свойство нулевого объекта.

В Mono вы можете следовать их руководству по отладке, чтобы легко перебирать ваш код и выявлять проблемы. Перейдите по этой ссылке https://docs.unity3d.com/Documentation/Manual/Debugger.html

Это так же просто, как поставить точку останова на строку, которую вы хотите отладить:

  1. Откройте свой проект в Mono Develop.
  2. нажмите кнопку воспроизведения в редакторе Unity.
  3. В Mono Develop выберите запустить присоединить к процессу... и выберите редактор Unity.
  4. Теперь вы можете использовать точки останова в Mono Develop и шагать по коду, просматривать переменные и т. Д.

Вот видео, которое поможет вам лучше понять это:

http://www.youtube.com/watch?v=-D6qXaGSC2k

Другие вопросы по тегам