Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты
Лидеры категории
Лена-пена Лена-пена
Искусственный Интеллект
М.И. М.И.
Искусственный Интеллект
Y.Nine Y.Nine
Искусственный Интеллект
king71alex Куклин Андрей Gentleman Dmitriy •••

C# Юнити ArgumentException: The Object you want to instantiate is null

seemeest Профи (640), закрыт 8 месяцев назад
Здравствуйте ,я переводил ошибку и понял что она значит ,но никак не могу понять почему так
Есть предположение что из-за того что класс с этой ошибкой хранится в массиве List
Проблема в этой функции
 //в другом классе я вот так создаю этот класс  
List chanks=new List();
chanks.Add(new Chank(0, 0));

private GameObject inst_Obj; //на inst_Obj ругается

private const int ChankSize = 16;

private const int ChankSizeY = 255;
void Create()

{

for (int xPos = 0; xPos < ChankSize; xPos++)

{

for (int yPos = 0; yPos < ChankSizeY - 1; yPos++)

{

for (int zPos = 0; zPos < ChankSize; zPos++)

{

if (GameMap[xPos, yPos, zPos] != 0f)

{

if (GameMap[xPos, yPos, zPos - 1] == 0f)

{

inst_Obj = Instantiate(Quad, new Vector3(xPos * 0.1f, yPos * 0.1f, zPos * 0.1f), Quaternion.Euler(0, 0, 0)) as GameObject;//перёд

setmaterial.setMaterial(ref inst_Obj, ref GameMap, xPos, yPos, zPos, SidesAheadm);

}



if (GameMap[xPos, yPos, zPos + 1] == 0f)

{

inst_Obj = Instantiate(Quad, new Vector3(xPos * 0.1f, yPos * 0.1f, zPos * 0.1f + 0.1f), Quaternion.Euler(180, 0, 0)) as GameObject;//зад

setmaterial.setMaterial(ref inst_Obj, ref GameMap, xPos, yPos, zPos, SidesRear);

}

if (GameMap[xPos - 1, yPos, zPos] == 0f)

{

inst_Obj = Instantiate(Quad, new Vector3(xPos * 0.1f - 0.05f, yPos * 0.1f, zPos * 0.1f + 0.05f), Quaternion.Euler(0, 90, 0)) as GameObject;//лево

setmaterial.setMaterial(ref inst_Obj, ref GameMap, xPos, yPos, zPos, SidesLeft);

}

if (GameMap[xPos + 1, yPos, zPos] == 0f)

{

inst_Obj = Instantiate(Quad, new Vector3(xPos * 0.1f + 0.05f, yPos * 0.1f, zPos * 0.1f + 0.05f), Quaternion.Euler(180, 90, 0)) as GameObject;//право

setmaterial.setMaterial(ref inst_Obj, ref GameMap, xPos, yPos, zPos, SidesRight);

}



if (GameMap[xPos, yPos + 1, zPos] == 0f)

{



inst_Obj = Instantiate(Quad, new Vector3(xPos * 0.1f, yPos * 0.1f + 0.05f, zPos * 0.1f + 0.05f), Quaternion.Euler(90, 0, 0)) as GameObject;//верх

setmaterial.setMaterial(ref inst_Obj, ref GameMap, xPos, yPos, zPos, SidesTop);

}

if (GameMap[xPos, yPos - 1, zPos] == 0f)

{

inst_Obj = Instantiate(Quad, new Vector3(xPos * 0.1f, yPos * 0.1f - 0.05f, zPos * 0.1f + 0.05f), Quaternion.Euler(-90, 0, 0)) as GameObject;//низ

setmaterial.setMaterial(ref inst_Obj, ref GameMap, xPos, yPos, zPos, SidesBottom);

}



}

}

}

}

}
Лучший ответ
serd Просветленный (20240) 2 года назад
seemeestПрофи (640) 2 года назад
Да,но я не понял что значит ссылается на сборку
serd Просветленный (20240) seemeest, Какую сборку?
Остальные ответы
Максим Искусственный Интеллект (218678) 2 года назад
1. Видимо, нужно через редактор назначить объект.
2. Изучай Clean Code (чистый код), старайся не делать код с большой глубиной (много блоков вправо), с большим количеством повторений (DRY) и божественными объектами и функциями. Старайся код делить на более мелкие функции.
МаксимИскусственный Интеллект (218678) 2 года назад
Например, вместо того, чтобы делать if (GameMap[xPos, yPos, zPos] != 0f), ты можешь написать наоборот:
if (GameMap[xPos, yPos, zPos] == 0f) continue; И тогда ты завершишь цикл досрочно, вместо того чтобы писать весь основной код смещённым вправо.
Exorcist Мудрец (10022) 2 года назад
конечно ругается, у тебя private GameObject inst_Obj; и все. просто пустое поле. Вот он и говорит, что "не могу создать копию объекта, так как там пустота, я хз че мне создавать". Ты этому полю ничего не присвоил через оператор "=". Для этого в любом случае нужна либо ссылка на объект, который будешь создавать, либо подгрузить его из проекта во время выполнения.

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

вот так:
[SerializeField] private GameObject inst_Obj;
temka game killer Мудрец (10086) 2 года назад
Не печатайте столько команд if else они замусорят весь код программы. Для этого есть switch case
Похожие вопросы