Представьте: ваш игрок собирает сокровища, экипирует мощное оружие и чувствует себя настоящим героем! Но без надежной системы инвентаря это всего лишь мечта. В этом гайде мы разберем, как создать систему инвентаря в Unity — от базовых структур до продвинутого UI с drag&drop. 👉 Готовы погрузиться в геймдев-магию? Давайте начнем!
👉 Шаг 1: Планирование Системы Инвентаря
Сначала определите нужды игры. Сколько слотов? Поддержка стаков (stacking)? Редкость предметов? Для RPG подойдут 50+ слотов с категориями (оружие, зелья). Для survival — динамический размер.
Ключевые фичи:
- Добавление/удаление предметов.
- Drag&drop между слотами.
- Использование предметов (equip/use).
- Сохранение в PlayerPrefs или JSON.
⭐ Совет: Начните с простого прототипа — 20 слотов, без стаков. Это сэкономит часы фрустрации!
👉 Шаг 2: Создание Модели Данных
Сердце системы инвентаря — классы Item и Inventory. Используйте ScriptableObjects для предметов — это удобно для редактора Unity.
public class Item : ScriptableObject {
public string itemName;
public int maxStack;
public Sprite icon;
public string description;
}
Inventory — список слотов:
[System.Serializable]
public class InventorySlot {
public Item item;
public int count;
}
public class Inventory : MonoBehaviour {
public InventorySlot[] slots = new InventorySlot[20];
}
Таблица Свойств Предметов
| Свойство |
Тип |
Описание |
| itemName |
string |
Название для UI |
| maxStack |
int |
Макс. стек (1 для unique) |
| icon |
Sprite |
Иконка в слоте |
| rarity |
enum |
Обычный/Редкий/Легендарный |
Создайте папку Assets/Items и assets для ScriptableObjects. Легко балансировать!
👉 Шаг 3: UI Инвентаря — Canvas и Слоты
Создайте Canvas (Screen Space Overlay). Добавьте Grid Layout Group для слотов. Каждый слот — Image с Button.
- InventoryPanel (Panel с Grid).
- SlotPrefab: Image (фон), IconImage, Text (кол-во), Button.
- InventoryManager скрипт на Canvas для обновления UI.
В UpdateUI() перебирайте слоты и обновляйте иконки:
foreach (var slotUI in slotUIs) {
if (inventory.slots[slotUI.index].item != null) {
slotUI.icon.sprite = inventory.slots[slotUI.index].item.icon;
slotUI.count.text = inventory.slots[slotUI.index].count.ToString();
}
}
👉 Шаг 4: Логика Добавления и Использования
Метод AddItem(Item item, int count):
public bool AddItem(Item item, int count) {
for (int i = 0; i < slots.Length; i++) {
if (slots[i].item == item && slots[i].count < item.maxStack) {
int space = item.maxStack - slots[i].count;
int add = Mathf.Min(count, space);
slots[i].count += add;
count -= add;
if (count == 0) {
UpdateUI();
return true;
}
}
}
// Найти пустой слот...
return false;
}
Для equip: Перенос в Equipment слоты. 🔥 Используйте события UnityEvent для уведомлений (OnItemAdded).
👉 Шаг 5: Drag & Drop — Магия Интерактива
Сделайте слоты IDragHandler, IBeginDragHandler (UnityEventSystem).
public class InventorySlotUI : MonoBehaviour, IDragHandler {
public void OnBeginDrag(PointerEventData eventData) {
dragItem = transform.GetChild(0); // Иконка
dragItem.SetParent(transform.parent);
dragItem.position = Input.mousePosition;
}
}
В OnDrop() проверяйте совместимость и свапайте предметы. Тестируйте на мобильных — добавьте touch support!
👉 Шаг 6: Сохранение и Оптимизации
Сериализуйте в JSON:
string json = JsonUtility.ToJson(inventory);
PlayerPrefs.SetString("Inventory", json);
Оптимизации:
- Object Pooling для иконок.
- Виртуальный скроллинг для больших инвентарей (Unity UI Extensions, ссылка).
- Профилирование: Избегайте Update() для UI, используйте события.
Для мультиплеера — Photon или Mirror с RPC.
🎉 Заключение: Ваш Инвентарь Готов к Битве!
Теперь вы знаете, как создать систему инвентаря, которая сделает вашу игру аддиктивной! Протестируйте, добавьте фильтры по rarity и tooltips. Готовы к следующему уровню? Экспериментируйте с crafting! Поделитесь своим прототипом в комментариях. Удачи в геймдеве! 👏