#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. Я изменил все на словарь, и стало намного проще отслеживать вещи. Теперь проблема решена. Спасибо!