Unity没有将精灵放在正确的位置

时间:2017-01-01 22:35:08

标签: c# unity3d nullreferenceexception

所以在这个游戏中,当玩家从场景中拾取物品时,我试图让它在他们的库存中绘制物品。问题是当玩家拿起一个项目时,精灵被绘制在错误的区域。我从itemid类调用additem并将其发送到库存类。当它被发送时,id随之而去,这就是它如何知道要绘制的项目。我正试图在清单中的下一个空槽中绘制它。清单类中的如果我在那些AddItem(0)中注释(或任何带有项目的数字),它会在正确的位置绘制精灵。关于它为什么绘制精灵的任何想法从itemid类调用它时的错误位置

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


public class Inventory : MonoBehaviour {

ItemDataBase database;
GameObject inventoryPanel;
GameObject slotPanel;
public GameObject inventorySlot;
public GameObject inventoryItem;
int slotAmount;
public List<Item> items = new List<Item>();
public List<GameObject> slots = new List<GameObject>();

 void Start()
{

    database = GetComponent<ItemDataBase>();

    slotAmount = 20;
    inventoryPanel = GameObject.Find("Inventory Panel");
    slotPanel = inventoryPanel.transform.FindChild("Slot Panel").gameObject;
    for (int i = 0; i < slotAmount; i++)
    {
        items.Add(new Item());
        // and empty slot
        slots.Add(Instantiate(inventorySlot));
        slots[i].GetComponent<Slot>().id = i;
        //set parent to slot panel
        slots[i].transform.SetParent(slotPanel.transform);
    }


   // AddItem(0);
   // AddItem(1);
   // AddItem(1);
   // AddItem(1);
   // Debug.Log(items[1].Title);
    inventoryPanel.SetActive(false);
}

void Update()
{
    if (Input.GetKeyDown("i") && inventoryPanel.activeSelf == false)
    {
        inventoryPanel.SetActive(true);
    }
   else if(Input.GetKeyDown("i") && inventoryPanel.activeSelf == true)
      {
        inventoryPanel.SetActive(false);
    }
}

public void AddItem(int id)
{

    inventoryPanel.SetActive(true);
    Item itemToAdd = database.FetchItemByID(id);

    if (itemToAdd.Stackable && checkIfItemIsInInventory(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++)
        {
            // in video had this set to -1
            if (items[i].ID == -1)
            {
                items[i] = itemToAdd;
                GameObject itemObj = Instantiate(inventoryItem);
                itemObj.GetComponent<ItemData>().item=itemToAdd;
                itemObj.GetComponent<ItemData>().amount = 1;
                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;
                itemObj.name = itemToAdd.Title;
                break;
            }
        }
    }
}

bool checkIfItemIsInInventory(Item item)
{
    for (int i = 0; i<items.Count; i++)
    {
        if (items[i].ID == item.ID)
        {
            return true;
        }

    }
    return false;
}

void RemoveItem(int id)     {         for(int i = 0; i&lt; items.Count; i ++)         {             if(items [i] .ID == id)             {                 items [i] = new Item();                 打破;             }         }     }     }

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

public class ItemId : MonoBehaviour {

public int id;
public Inventory additem;
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}

void OnTriggerEnter2D (Collider2D other)
{
    if (other.gameObject.tag == "Player")
    {
        Debug.Log(id);
        additem.AddItem(1);

        Destroy(gameObject);

    }
}
}

0 个答案:

没有答案