C# Юнити ArgumentException: The Object you want to instantiate is null
Здравствуйте ,я переводил ошибку и понял что она значит ,но никак не могу понять почему так
Есть предположение что из-за того что класс с этой ошибкой хранится в массиве List
Проблема в этой функции
//в другом классе я вот так создаю этот класс
List<Chank> chanks=new List<Chank>();
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);
}
}
}
}
}
}
1. Видимо, нужно через редактор назначить объект.
2. Изучай Clean Code (чистый код), старайся не делать код с большой глубиной (много блоков вправо), с большим количеством повторений (DRY) и божественными объектами и функциями. Старайся код делить на более мелкие функции.
конечно ругается, у тебя private GameObject inst_Obj; и все. просто пустое поле. Вот он и говорит, что "не могу создать копию объекта, так как там пустота, я хз че мне создавать". Ты этому полю ничего не присвоил через оператор "=". Для этого в любом случае нужна либо ссылка на объект, который будешь создавать, либо подгрузить его из проекта во время выполнения.
Самый простой вариант для начинающего:
добавь атрибут и поле станет видимым в инспекторе, затем в это поле перетащи префаб, который надо создать. запусти игру и тогда всё заработает.
вот так:
[SerializeField] private GameObject inst_Obj;
Не печатайте столько команд if else они замусорят весь код программы. Для этого есть switch case