проблема с пользовательским интерфейсом системы слотов инвентаря - PullRequest
1 голос
/ 18 июня 2019

У меня возникли проблемы с логикой слотов предметов в пользовательском интерфейсе инвентаря.

Я хочу, чтобы при вызове этого метода этот метод проверял список ItemSlots (который представляет собой список, в котором хранятся слоты элементов, созданные из префаба ItemSlot), с playerInventory.InventoryList (который содержит элементы). .

Затем я хочу добавить и удалить игровые объекты из слотов предметов в зависимости от инвентаря игрока (т. Е. Список должен обновляться по мере того, как я поднимаю и опускаю предметы)

Вот мой текущий код:

public void UpdateUI()
    {
        for (int i = 0; i < playerInventory.InventoryList.Count; i++)
        {          
            if (playerInventory.InventoryList[i] != null)
            {
                Debug.Log("Creating new inventory slot...");
                itemSlots.Add(Instantiate(itemSlot, contentPanel.transform));
                itemSlots[i].transform.SetParent(contentPanel.transform);
                ItemSlot newSlot = itemSlots[i].GetComponent<ItemSlot>();
                newSlot.AddItem(playerInventory.InventoryList[i]);
            }
        }
}

В настоящее время элементы добавляются, но проблема в том, что каждый раз, когда я вызываю UpdateUI, он добавляет новые пустые кнопки из моего префаба. Я знаю, почему это происходит, потому что каждый раз, когда я вызываю UpdateUI, он проверяет, не меньше ли i = 0, чем playerInventory.InventoryList.Count, что всегда верно, но я не знаю, как это исправить.

Я также не знаю, как удалить эти элементы пользовательского интерфейса после того, как они были созданы (т. Е. Если игрок уронил предмет).

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

Любые советы будут приветствоваться, спасибо!

1 Ответ

1 голос
/ 18 июня 2019

itemSlots, похоже, уже имеет некоторые записи.itemSlots.Add всегда добавляет новые элементы в конец этого списка, но их индекс может отличаться от i индексов playerInventory.InventoryList.


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

public void UpdateUI()
{
    // first clean up previously instantiated stuff
    while(contentPanel.transform.childcount != 0)
    {
        Destroy(contentPanel.transform.GetChild(0));
    }

    // also reset the according list
    itemSlots.Clear();

    foreach (var inventoryItem in playerInventory.InventoryList)
    {          
        if (inventoryItem != null)
        {
            Debug.Log("Creating new inventory slot...");
            var newSlot = Instantiate(itemSlot, contentPanel.transform).GetComponent<ItemSlot>();
            newSlot.AddItem(inventoryItem);
            itemSlots.Add(newSlot.gameObject);
        }
    }
}

в качестве небольшого совета: если вы на самом деле делаете itemSlot и itemSlots типа

public ItemSlot itemSlot;

public List<ItemSlot> itemSlots = new List<ItemSlot>();

вместо GameObject и перетащите в префаб, который вы можете позже просто использовать

var newSlot = Instantiate(itemSlot, contentPanel.transform);
newSlot.AddItem(inventoryItem);
itemSlots.Add(newSlot);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...