-1

Пишу систему инвентаря, есть класс предмета:

public class Item
{
    public int Id;
    public string Name;
    public Sprite Img;
public Item(int id, string name)
{
    Id = id;
    Name = name;
    Img = Resources.Load<Sprite>("Sprites/items/" + name + ".png");
}

}

Класс слота:

public class Slot
{
    public enum Type
    {
        STORAGE,
        HEAD,
        BODY,
        LEGS,
        BELT
    }
public int Id;
public bool Empty;
public Item ItemInSlot;
public Type SlotType;

public Slot(int id, Type type)
{
    Id = id;
    Empty = true;
    ItemInSlot = null;
    SlotType = type;
}

}

И класс DataBase со всеми предметами:

public class DataBase : MonoBehaviour
{
    public List<Item> Items;
private void Start()
{
    Items = new List&lt;Item&gt;
    {
        new Item(0, &quot;test-item-1&quot;),
        new Item(1, &quot;test-item-2&quot;),
        new Item(2, &quot;test-item-3&quot;)
    };
}

}

В скрипте, который висит на панели инвентаря есть функция AddItem():

    public void AddItem(Item item)
    {
        for(int i = 0; i < inventory.Slots.Count; i++)
        {
            if (inventory.Slots[i].Empty)
            {
                inventory.Slots[i].Empty = false;
                inventory.Slots[i].ItemInSlot = item;
            }
        }
    }

Эту функцию я вызываю на старте и при запуске ошибка NullReferenceException.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class InventoryStorage : MonoBehaviour { public DataBase Data;

public int InventorySize;
public GameObject SlotPrefab;

private Inventory inventory;

private void Start()
{
    inventory = new Inventory(InventorySize);
    DrawSlots();

    AddItem(Data.Items[0]);
}

Ошибка на 20 строке AddItem(...); В инспекторе все поля скрипта заполнены. В чём может быть проблема? Я знаю что это за ошибка, но не могу найти где в коде используется null. Полный текст ошибки:

NullReferenceException: Object reference not set to an instance of an object InventoryStorage.Start () (at Assets/Scripts/InventoryStorage.cs:20)

aqkrie
  • 19
  • 8
  • Проблема однозначно в том, что у вас поле NULL. Приложите текст ошибки, на какой строке возникает. – A K Oct 23 '20 at 17:33
  • А где вы инициализируете Data? Там явно null, вы ему ничего не присвоили после объявления public DataBase Data; – CrazyElf Oct 23 '20 at 17:52
  • @CrazyElf это публичное поле, я его инициализирую в инспекторе – aqkrie Oct 23 '20 at 17:56
  • @aqkrie Ну, это как-то как-то. Чем вы его инициализируете? – CrazyElf Oct 23 '20 at 17:58

1 Answers1

2
public DataBase Data; // null

После такого объявления в Data находится null - значение по умолчанию для объектов reference type, в частности для классов.

AddItem(Data.Items[0]);

Вы тут берёте .Items от null, вот и выходит ошибка. Вам надо как-то проинициализировать поле Data - присвоить туда новый объект типа DataBase, например, но и после этого будет та же ошибка, поскольку в Data.Items будет снова null, надо заполнить ещё и это поле.

public List<Item> Items; // null
CrazyElf
  • 71,194
  • В поле Data я кидаю камеру, на которой висит скрипт DataBase, по идее это должно оработать, т.к. работало с другими скриптами. Если проблема действительно в этом, то как тогда инициализировать, если DataBase это MonoBehaviour класс? – aqkrie Oct 23 '20 at 18:02
  • 1
    Если инициализировать поле Data, почему Data.Items = null? – aqkrie Oct 23 '20 at 18:10
  • "По идее это должно работать": ну вот не работает же. Если работало в других скриптах - смотрите в чём разница. – A K Oct 23 '20 at 18:20
  • @aqkrie Потому что опять же они ничем не инициализированы public List<Item> Items; в них что-то будет только после вызова метода Start там – CrazyElf Oct 23 '20 at 18:20