0

При нажатии на клавишу F и наведении на обьект с тегом Item выводит ошибку "Не задана ссылка на екземпляр обьекта". Не могу понять, что не так. Вот скрипт. Ошибка возникает на строчке с "foreach (Cell mainCell in inventory.cells)".

using UnityEngine;
public class DetectingItem : MonoBehaviour {

[SerializeField]
private float raycastDistance;
[SerializeField]
private GameObject PressF;
public Stick items;
public Inventory inventory;

public RaycastHit hit;
public GameObject hittedObject;

public Camera fpsCam;

void Start() {

}

void FixedUpdate() {
    if (Physics.Raycast(fpsCam.transform.position, fpsCam.transform.forward, out hit, raycastDistance))
    {
        if (hit.transform.tag == "Item")
        {
            PickUpItem();
            hittedObject = hit.collider.gameObject;
            PressF.SetActive(true);

        } else
        {
            hittedObject = null;
            PressF.SetActive(false);
        }
    }
}

void PickUpItem()
{
    if (Input.GetKeyDown(KeyCode.F))
    {
        foreach (Cell mainCell in inventory.cells)
        {
            if (!mainCell.isFull)
            {
                Instantiate(items.Icon, mainCell.transform);
                mainCell.isFull = true;
            }
        }
    }
}
}

Вот другой скрипт с массивом cells.

using UnityEngine;

public class Inventory : MonoBehaviour {

public Canvas canvas;
public GameObject mainInventory;
public GameObject activeInventory;
public Cell[] cells;

void Start () {
    cells = new Cell[30];
}

void FixedUpdate () {

    if (Input.GetKeyDown(KeyCode.E))
    {
        activeInventory.SetActive(!activeInventory.activeSelf);
    }
}
}

Почитал другие вопросы, говорят что ссылка ссылается на переменную со значением null. Но у меня переменная не имеет значение null.

JediMan
  • 117
  • "у меня переменная не имеет значение null" - какая переменная? –  Nov 15 '18 at 19:34
  • Точнее массив inventory.cells. – JediMan Nov 15 '18 at 19:41
  • 3
    объект забыл переместить в инспекторе в скрипт – Anton Nikolaev Nov 15 '18 at 19:42
  • В инспектора обьекты мне и не нужно перемещать. Оно видит в переменной mainCell значение null. Но оно не null, оно имеет значения isFull = false, amount = 0, cellObject = null; Может в cellObject нужно что-то присвоить? Хотя мне надо что бы оно оставалось пустым... – JediMan Nov 15 '18 at 19:53
  • 1
    дебажся и увидишь что он и вправду налл. TEA полюбому прав. – Andrew Stop_RU_war_in_UA Nov 15 '18 at 20:38

1 Answers1

2

Ваше поле не инициализировано. Перемести объект в инспекторе. Или найдите его через код с помощью GameObject.Find()
У вас null из-за этого.
Ваш скрипт инвентаря наследуюется от MonoBehaviir просто объявлением переменной вы его не инициализируете. Поэтому и лезет ошибка. Вы не исправите если не инициализируете. Ни один комментарий в таком случае не поможет.

if (Input.GetKeyDown(KeyCode.F))
    {
        Debug.Log(inventory);
        foreach (Cell mainCell in inventory.cells)
        {
            if (!mainCell.isFull)
            {
                Instantiate(items.Icon, mainCell.transform);
                mainCell.isFull = true;
            }
        }
    }
Andrey
  • 695
  • Но как мне его инициализировать? Переменная типа Cell имеет внутри переменные isFull = false, amount = 0. Что мне нужно инициализировать? – JediMan Nov 16 '18 at 15:07
  • вам нужно инициализировать не cell, a inventory. Ибо он хранит в себе cell – Andrey Nov 16 '18 at 15:44
  • В инспекторе перетянул скрипт на все ячейки. Все равно не работает. – JediMan Nov 16 '18 at 16:49
  • А где именно у вас был скрипт? Где именно на сцене ? – Andrey Nov 16 '18 at 16:58
  • На каждой ячейке по скрипту. На персонаже висит DetectingItem скрипт(в котором проблема) и Inventory. – JediMan Nov 16 '18 at 17:00
  • Добавьте дебаг там же где написал я в ответе. И скажите что он выведет вам – Andrey Nov 16 '18 at 17:04
  • У меня появилась идея насчёт вашей проблемы. – Andrey Nov 16 '18 at 18:03
  • Ваш класс Cell наследуется от MonoBehavior? Если да то его инициализировать нужно так же через инспектор. Проблемно ибо их много. – Andrey Nov 16 '18 at 18:05
  • Можете попробовать найти из через FindObjectsOfType(). – Andrey Nov 16 '18 at 18:06
  • 1
    Решил наконецто проблему. Оказывается, всё было банально просто. В скрипте DetectingItem есть переменная public Inventory inventory; А она, как раз таки не была перетянута в инспекторе) Вообщем, мне еще учится и учится) – JediMan Nov 16 '18 at 19:45