Question by
thomas1231 · Apr 19, 2017 at 11:54 PM ·
nullreferenceexceptioninventorynull reference exception
Im getting NullReferenceException error
Im getting NullReferenceException error for this line this.transform.SetParent (inv.slots[slot].transform); in the item data class when trying to move one of the item in the inventory to a another slot.
here is my code public class Inventory : MonoBehaviour {
GameObject inventoryPanel;
GameObject slotPanel;
ItemDatabase database;
public GameObject inventorySlot;
public GameObject inventoryItem;
int slotAount;
public List<Item> items = new List<Item>();
public List<GameObject> slots = new List<GameObject>();
void Start()
{
database = GetComponent<ItemDatabase>();
slotAount = 25;
inventoryPanel = GameObject.Find("Inventory Panel");
slotPanel = inventoryPanel.transform.FindChild("Slot Panel").gameObject;
for (int i = 0; i < slotAount; i++)
{
items.Add(new Item());
slots.Add(Instantiate(inventorySlot));
slots [i].GetComponent<Slot> ().id = i;
slots[i].transform.SetParent(slotPanel.transform);
}
AddItem(2);
AddItem(1);
}
public void AddItem(int id)
{
Item itemToAdd = database.FetchItemByID(id);
if (itemToAdd.Stackable && CheckItem(itemToAdd))
{
for (int i = 0; i < items.Count; i++)
{
if (items[i].ID == id)
{
ItemData data = slots[i].transform.GetChild(0).GetComponent<ItemData>();
data.amount++;
data.transform.GetChild(0).GetComponent<Text>().text = data.amount.ToString();
break;
}
}
}
else
{
for (int i = 0; i < items.Count; i++)
{
if (items[i].ID == -1)
{
items[i] = itemToAdd;
GameObject itemObj = Instantiate(inventoryItem);
itemObj.GetComponent<ItemData>().item = itemToAdd;
itemObj.GetComponent<ItemData> ().slot = i;
itemObj.transform.SetParent(slots[i].transform);
itemObj.transform.position = Vector2.zero;
itemObj.GetComponent<Image>().sprite = itemToAdd.Sprite;
itemObj.name = itemToAdd.Title;
break;
}
}
}
}
bool CheckItem(Item item)
{
for (int i = 0; i < items.Count; i++)
if (items[i].ID == item.ID)
return true;
return false;
}
}
public class ItemData : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { public Item item; public int amount; public int slot;
private Inventory inv;
private Vector2 offset;
void Strat()
{
inv = GameObject.Find ("Inventory").GetComponent<Inventory> (); }
public void OnBeginDrag (PointerEventData eventData)
{
if (item != null)
{
offset = eventData.position - new Vector2 (this.transform.position.x, this.transform.position.y);
this.transform.SetParent (this.transform.parent.parent);
this.transform.position = eventData.position - offset;
GetComponent<CanvasGroup> ().blocksRaycasts = false;
}
}
public void OnDrag (PointerEventData eventData)
{
if (item != null)
{
this.transform.position = eventData.position - offset;
}
}
public void OnEndDrag (PointerEventData eventData)
{
this.transform.SetParent (inv.slots[slot].transform);
this.transform.position = inv.slots[slot].transform.position;
GetComponent<CanvasGroup> ().blocksRaycasts = true;
}
}
public class Slot : MonoBehaviour, IDropHandler { public int id; private Inventory inv;
void Start()
{
inv = GameObject.Find ("Inventory").GetComponent<Inventory> ();
}
public void OnDrop (PointerEventData eventData)
{
ItemData droppeditem = eventData.pointerDrag.GetComponent<ItemData> ();
if (inv.items [id].ID == -1) {
inv.items [droppeditem.slot] = new Item ();
inv.items [id] = droppeditem.item;
droppeditem.slot = id;
} else
{
Transform item = this.transform.GetChild (0);
item.GetComponent<ItemData> ().slot = droppeditem.slot;
item.transform.SetParent (inv.slots[droppeditem.slot].transform);
item.transform.position = inv.slots[droppeditem.slot].transform.position;
inv.items [droppeditem.slot] = item.GetComponent<ItemData> ().item;
inv.items [id] = droppeditem.item;
droppeditem.slot = id;
droppeditem.transform.SetParent (this.transform);
droppeditem.transform.position = this.transform.position;
}
}
}
Comment
Best Answer
Answer by Vicarian · Apr 20, 2017 at 04:57 AM
Problem is the ItemData class. You mistyped Start(), so inv never takes a value and remains null. Hence, the ReferenceExceptions.