Организация инвентаризации по алфавиту - PullRequest
0 голосов
/ 08 апреля 2020

Итак, я создал метод для заполнения системы инвентаризации, которую я создал в Unity, однако я не могу найти способ упорядочить их в алфавитном порядке. Каждая кнопка создается как дочерняя панель панели держателя кнопки, которая является переменной игрового объекта. Этот метод вызывается всякий раз, когда игрок поднимает что-то.

private void Populate_Inventory ( )
{
    Button btn_CurrentItem;

    int int_Count;

    for ( int_Count = int_PreviousCount; int_Count < strList_Inventory.Count; int_Count++ )
    {
        btn_CurrentItem = Instantiate ( btn_Item, pnl_ButtonHolder.transform );
        btn_CurrentItem.name = strList_Inventory [ int_Count ];
        btn_CurrentItem.GetComponentInChildren<Text> ( ).text = strList_Inventory [ int_Count ];
        btn_CurrentItem.gameObject.AddComponent<Inventory_Item> ( );
        btn_CurrentItem.GetComponent<Inventory_Item> ( ).str_Name = cls_Pickup.str_PickupName;
        btn_CurrentItem.GetComponent<Inventory_Item> ( ).str_Information = cls_Pickup.str_PickupInformation;

        int_PreviousCount = int_Count;
    }

    int_PreviousCount++;
}

Если кто-то может помочь, это будет очень признательно.

Джонатан Палмер

1 Ответ

0 голосов
/ 09 апреля 2020

Основная проблема этого подхода заключается в том, что вы добавляете по одной кнопке за раз, когда выбираете элемент, и эти кнопки создаются как дочерние элементы объекта pnl_ButtonHolder, но ваш метод не знает о предыдущих кнопках. которые были созданы.

Вариант 1 (Плохо)

Вы можете использовать метод GetComponentsInChildren<Button>() для объекта pnl_ButtonHolder, чтобы получить все компоненты кнопки, которые были ранее созданы после того, как вы добавили новую кнопку, а затем отсортировали ваши кнопки по их названию.

Это не идеально, поскольку GetComponentsInChildren<>() является дорогостоящим методом и не использует идею инвентаризации очень хорошо.

Вариант 2 (Хороший)

Создайте класс Inventory, который управляет вашим фактическим инвентарем, включая сортировку предметов. Это может выглядеть примерно так:

public class Inventory_Button : MonoBehaviour
{
    public Button button = default;

    public void Initialize(Intenvory_Item item)
    {
        button.name = item.name;
        // Other work here.
    }
}

public class Inventory : MonoBehaviour
{
    public GameObject inventoryItemPrefab = default;
    public Transform inventoryParent = default;

    private List<Inventory_Item> _inventory = new List<Inventory_Item>();
    private List<Inventory_Button> _inventoryButtons = new List<Inventory_Button>();

    public void AddItem(Intenvory_Item item)
    {
        _inventory.Add(item);
        Inventory_Button button = GameObject.Instantiate(inventoryItemPrefab, inventoryParent).GetComponent<Inventory_Button>();
        button.Initialize(item);
        _inventoryButtons.Add(button);
        _inventoryButtons.Sort((x, y) => x.name.CompareTo(y.name));
    }

    public void RemoveItem(Inventory_Item item)
    {
        // Do work to remove the item.
    }
}

Этот вид настройки полезен по нескольким причинам:

  1. Управление вашими запасами теперь выполняется одним классом, а не коллекцией объекты. Это облегчает взаимодействие с ним.
  2. Это значительно облегчит удаление предметов в будущем. С вашей текущей реализацией, похоже, вам будет трудно удалить предмет из инвентаря игрока.
  3. Он разделяет ответственность между классом Inventory, классом Inventory_Item и Inventory_Button класс, каждый из которых стоит самостоятельно и работает вместе.

Несколько заключительных замечаний:

  • Я пропустил некоторые детали в двух вышеупомянутых классах. Вы должны заполнить их в соответствии с потребностями вашей игры.
  • Вы можете повысить эффективность сортировки, используя что-то вроде Insertion Sort . Это решение выполнит свою работу.
  • Использование префиксов для именования ваших переменных может быть довольно запутанным для людей, пытающихся прочитать ваш код. Я рекомендую вам проверить руководство по стилю. Здесь есть отличный здесь .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...