Как я могу использовать свой существующий массив как список? - PullRequest
1 голос
/ 23 июня 2019

У меня есть массив, который контролирует мой список инвентаря пользовательского интерфейса.Когда я добавляю GameObject к массиву, функция также добавляет тот же GameObject к моему инвентарному интерфейсу.

В моем скрипте у меня также есть функция удаления, которая удаляет GameObject из массива иудаляет GameObject из пользовательского интерфейса.

Моя проблема заключается в том, что мне нужно изменить этот массив на список, чтобы он мог работать динамически, поскольку список имеет встроенную функциональность для перемещения элементов массивав начало массива (то есть переместить их влево в индексе массива).

Например, в настоящее время при использовании массива, когда я выбираю пункты 1,2,3,4 и 5. Затем яперейдите к удалению элемента 3. То, что осталось в моем массиве, это 1,2, ноль, 4 и 5. Кроме того, то, что осталось в моем интерфейсе инвентаря, это GameObject s в слотах 1,2, ноль, 4,5,В этом случае пустым является изображение пользовательского интерфейса, на котором ничего нет.

Преобразовав этот массив в список, я считаю, что я могу избежать пробелов в пользовательском интерфейсе инвентаризации.Также я знаю, что мой массив и / или список всегда будут состоять из 16 элементов.

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

Исходное использование массива:

public class Inventory : MonoBehaviour
{
    public GameObject[] inventory = new GameObject[16];
    public List<GameObject> inventory2 = new List<GameObject>();

    public void AddItem(GameObject item)
    {
        bool itemAdded = false;

        //find the first open slot in inventory
        for (int i = 0; i < inventory.Length; i++)
        {
            if (inventory[i] == null)
            {
                inventory[i] = item;

                //Update UI
                InventoryButtons[i].image.overrideSprite = 
    item.GetComponentInChildren<SpriteRenderer>().sprite;
        }
    }
}

Моя попыткапреобразуйте это в список и используйте его следующим образом:

public class Inventory : MonoBehaviour
{
    public List<GameObject> inventory = new List<GameObject>();

    public void AddItem(GameObject item)
    {
        bool itemAdded = false;

        //find the first open slot in inventory
        for (int i = 0; i < inventory.Count; i++)
        {
            if (inventory[i] == null)
            {
                inventory[i] = item;

                //Update UI
                InventoryButtons[i].image.overrideSprite = 
     item.GetComponentInChildren<SpriteRenderer>().sprite;
            }
        }
    }
}

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

1 Ответ

0 голосов
/ 23 июня 2019

Если версия массива работает, и вы всегда хотите 16 элементов, почему бы просто не сделать это, чтобы удалить элемент:

//remove item at index 5
for (int i = 5; i < inventory.Count - 1; i++)
  inventory[i] = inventory[i+1];

inventory[inventory.Length - 1] = null;

Мы начинаем с индекса 5, который должен быть удален, и переходим к концу массива-1, копируя каждый следующий элемент поверх текущего. Затем мы заканчиваем цикл и делаем последний элемент пустым

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...