2016-12-29 39 views
1

此代码正在为RPG游戏创建库存。我正在调用项目数据库中的项目信息,这是一个json文件。由于某些原因,它正在跳过这一行。我在代码中标记了它,使其更加突出。为什么我的代码跳过这一行

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

你是什么意思的“跳过这一行”?你是否在调试器中逐步了解代码,看看究竟发生了什么? – ChrisF

+0

是的,我已经去了data.amount ++;然后跳转到没有任何东西的程序的其他部分与本节相关。跳过** data.transform.GetChild(0).GetComponent ().text = data.amount.ToString(); ** –

+0

和break; 抱歉不能编辑帖子,所以我不得不再做一个 –

回答

0

尝试放置一个断点在块上方:通过

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

步骤:

if (items[i].ID == id){ 

或甚至更高(使用F10)并查看它是否击中林即当其中一个条件没有得到满足时,可能会跳出来。那么,或者如果您需要在整个for循环中执行此行,则由于接下来的break;,它会在第一次碰到行时跳出循环。

无论采用哪种方式,都要在断点后面逐行浏览,并检查所有内容的值。确保你没有得到null引用或值。

+0

我已经多次调试程序。它会在for循环中到达它的正上方,然后退出,甚至不会进入到休息线等待我按下键来休息; –

+0

如果它永远不会进入'for'循环,或者'items.Count'没有值,或者它完全跳过了这个块,这意味着if(itemToAdd.Stackable && checkIfItemIsInInventory(itemToAdd))'返回false 。 –

+0

@bobsmith - 你是如何在代码中放置一个断点的? (不要与你有'break'的那一行混淆)。我知道你说过你是新手,所以我只想确保我们在同一页面上。 –

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.amount - - 找不到构件“量”的“对象” 量----标识符“amount'is不在范围

所以打破这一切下行数据在这里 的ItemData数据=时隙初始化[一世]。 transform.GetChild(0).GetComponent();

量是在这里(这就是所谓的ItemData System.Collections中使用不同的文件;使用UnityEngine ; 使用System.Collections.Generic

public class ItemData : MonoBehaviour { 

public Item item; 
public int amount; 
} 

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

+0

,它会跳出所有循环并检查玩家是否在敌人旁边的一个箱子中。所以完全不同的东西,甚至没有在这个领域叫。 –

+0

看起来像你解决了你自己的问题...好的工作 – Joe

+0

哦,不,它没有解决:(它仍然是它 –