Считыватель строк работает только 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
Это так же просто, как поставить точку останова на строку, которую вы хотите отладить:
- Откройте свой проект в Mono Develop.
- нажмите кнопку воспроизведения в редакторе Unity.
- В Mono Develop выберите запустить присоединить к процессу... и выберите редактор Unity.
- Теперь вы можете использовать точки останова в Mono Develop и шагать по коду, просматривать переменные и т. Д.
Вот видео, которое поможет вам лучше понять это: