Основная проблема этого подхода заключается в том, что вы добавляете по одной кнопке за раз, когда выбираете элемент, и эти кнопки создаются как дочерние элементы объекта 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.
}
}
Этот вид настройки полезен по нескольким причинам:
- Управление вашими запасами теперь выполняется одним классом, а не коллекцией объекты. Это облегчает взаимодействие с ним.
- Это значительно облегчит удаление предметов в будущем. С вашей текущей реализацией, похоже, вам будет трудно удалить предмет из инвентаря игрока.
- Он разделяет ответственность между классом
Inventory
, классом Inventory_Item
и Inventory_Button
класс, каждый из которых стоит самостоятельно и работает вместе.
Несколько заключительных замечаний:
- Я пропустил некоторые детали в двух вышеупомянутых классах. Вы должны заполнить их в соответствии с потребностями вашей игры.
- Вы можете повысить эффективность сортировки, используя что-то вроде Insertion Sort . Это решение выполнит свою работу.
- Использование префиксов для именования ваших переменных может быть довольно запутанным для людей, пытающихся прочитать ваш код. Я рекомендую вам проверить руководство по стилю. Здесь есть отличный здесь .