Ошибка NullReferenceException: Object reference not set to an instance of an object. Не понимаю суть проблемы [дубликат]

181
21 апреля 2019, 22:00

На данный вопрос уже ответили:

  • Что такое NullReferenceException, и как мне исправить код? 2 ответа

При нажатии на клавишу 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.

Answer 1

Ваше поле не инициализировано. Перемести объект в инспекторе. Или найдите его через код с помощью 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;
            }
        }
    }
READ ALSO
Не удаляется часть строки (string) в C#

Не удаляется часть строки (string) в C#

Когда я копирую текст из TextBox(multiline) в строку, а потом пытаюсь из нее что-то удалить - со строкой НИЧЕГО не происходитВот часть кода:

127
Как добавить DataGrid в ячейку?

Как добавить DataGrid в ячейку?

На макете имеется DataGrid, у которого один столбец и одна ячейкаКак добавить ещё один (вложенный выходит) DataGrid в эту ячейку? Что-то такое:

238
C# Контроль времени выполнения Task и его отмена

C# Контроль времени выполнения Task и его отмена

получаю данный от Tcp сервера, если запрос длится более 1 сек, то завершаем Task ожидания получения ответа и выкидываем TimeoutException("

148
В C# windows form преобразование типа string в double и наоборот

В C# windows form преобразование типа string в double и наоборот

Как сделать что бы из textbox значения перевести в тип double и что бы читалась в числе и точка и запятая?И как вывести в label тип double?

179