Top.Mail.Ru
Ответы

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

Здравствуйте ,я переводил ошибку и понял что она значит ,но никак не могу понять почему так
Есть предположение что из-за того что класс с этой ошибкой хранится в массиве List
Проблема в этой функции

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
 //в другом классе я вот так создаю этот класс  
   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