为什么我的代码会跳过此行

时间:2016-12-29 23:19:16

标签: c# unity3d

此代码正在为RPG游戏创建广告资源。我从作为json文件的Items数据库中调用项目信息。由于某些原因,它正在跳过这一行。我在代码中标记了它,使它更突出。

data.transform.GetChild(0).GetComponent<Text>().text = data.amount.ToString();

这是整个代码

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>();

private 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));
        //set parent to slot panel
        slots[i].transform.SetParent(slotPanel.transform);
    }
    for (int i = 0; i < items.Count; i++)
    {
        items[i].ID = -1;
    }

        AddItem(0);
    AddItem(1);
    AddItem(1);
    Debug.Log(items[1].Title); 
}

public void AddItem(int id)
{


    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.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;
}
}

2 个答案:

答案 0 :(得分:1)

这是一些调试信息。首先,这是它正在弄乱的整个功能

 public void AddItem(int id)
{


    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;
            }
        }
    }

所以当我在调试时到达这一行

  data.amount++;
手表说 data ---- null data.amount ----找不到'对象'的成员'金额' amount ----标识符'amount'不在范围内

所以打破所有这些数据在这里初始化     ItemData data = slots [i] .transform.GetChild(0).GetComponent();

金额在这里(这是一个名为ItemData的不同文件     使用System.Collections;     使用System.Collections.Generic;     使用UnityEngine;

public class ItemData : MonoBehaviour {

public Item item;
public int amount;
}

感谢大家的帮助我真的只是想学习如何更好地编码。

答案 1 :(得分:0)

尝试在上面的区块放置一个断点:

if (itemToAdd.Stackable && checkIfItemIsInInventory(itemToAdd)){

或甚至更高:

for

单步执行(使用F10)并查看它是否在线上。当其中一个条件得不到满足时,它可能会跳出来。那个,或者如果你需要在整个break;循环中执行这一行,它会在第一次遇到该行时跳出循环,因为null跟随。

无论哪种方式,在断点之后逐行执行,并检查所有值的值。确保您没有获得 Interest1 Interest2 Interest3 Event_Type1 Event_Type2 Event_Type3 u1 1 0 1 3 5 2 u2 0 0 1 1 0 2 u3 1 1 0 2 1 7 引用或值。