Пользовательский интерфейс инвентаризации ведет себя странно при обновлении сумм

#c# #unity3d #user-interface

#c# #unity3d #пользовательский интерфейс

Вопрос:

Итак, у меня есть класс item, класс inventory и скрипты UIController. Когда игрок перебирает предмет на поле, игрок должен добавить предмет в инвентарь, если у него / нее есть предмет, это должно увеличить количество на единицу.

Проблема, с которой я сталкиваюсь, заключается в том, что числа в пользовательском интерфейсе являются случайными, и иногда элементы добавляют суммы, в других случаях они просто используют новый слот. Я добавил три скрипта, о которых упоминал выше.

 public Item() 
{
    amount = 0;
}

public int GetItemAmount() 
{
    return amount;
}

public void IncreaseAmount(int amt) 
{
    amount  = amt;
}    

public void SpawnItem() 
{
    Instantiate(prefab);
}
  
 public Inventory() 
{
    inventory = new List<Item>();
}
    
    
// Add item to inventory. if item is already in inventory, increase amount.
public void AddItem(Item item) 
{    
    if (inventory.Count == 0)
    {
        inventory.Add(item);
    }
    else
    {
        for (int i = 0; i < GetInventory().Count; i  )
        {
            if (this.inventory[i] == item)
            {
                inventory[i].IncreaseAmount(1);
                break;
            }
            else
            {    
                 inventory.Add(item);                        
            }
            break;
         }  
     }
}
  
 void Start()
{
    player = GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerController>();
    inventoryItems = CreateInventoryItemUI(itemSlotImage);
}

private void Update()
{
    var playerItems = player.inventory.GetInventory();

    for (int i = 0; i <= playerItems.Count ; i  )
    {
        //Debug.Log("The value of i is : "   i);
        if (playerItems[i] != null)
        {
            inventoryItems[i].GetComponentInChildren<Image>().sprite = playerItems[i].imageIcon;
            var amountUI = inventoryItems[i].transform.Find("ItemSlotAmount").GetComponent<Text>();
            amountUI.gameObject.SetActive(true);
            amountUI.text = playerItems[i].GetItemAmount().ToString();
            Debug.Log("The items being added will be: "   amountUI.text);
            inventoryItems[i].gameObject.SetActive(true);
        }
    }
}
  

Я думаю, что я просто еще одна пара глаз. Я отладил и проверил ссылку на метод увеличения суммы, и он используется только в скрипте инвентаризации.

Любые идеи были бы очень полезны.

Ответ №1:

Вы проверяете, является ли добавленный элемент точно таким же объектом, как в списке, как в той же ссылке. Я предполагаю, что это, вероятно, не то, что вы хотите, пожалуйста, опубликуйте часть кода, вызывающую AddItem в противном случае.

Два предложения:

Сначала добавьте свойство Id к элементу и сравните, имеет ли добавляемый элемент тот же идентификатор, вместо сравнения ссылок.

Во-вторых, это, вероятно, было бы чище и эффективнее, если бы вы использовали словарь вместо списка для хранения элементов. Попробуйте!

Комментарии:

1. Я изменил все на словарь, и стало намного проще отслеживать вещи. Теперь проблема решена. Спасибо!