Создание системы инвентаря — важная часть разработки игры, особенно если она включает в себя управление предметами. В этой статье мы рассмотрим, как создать систему инвентаря с возможностью добавления, удаления, перемещения и использования предметов. Также мы создадим интерфейс, который позволит игроку взаимодействовать с предметами в игре.
1. Планирование системы инвентаря
Прежде чем приступать к коду, важно определить ключевые компоненты:
- Типы предметов:
 
- Простые ресурсы (например, золото, еда).
 - Объекты, которые занимают слоты в инвентаре (например, оружие, броня).
 
- Слоты инвентаря: Ячейки, которые могут содержать предметы.
 - Действия с предметами: Добавление, удаление, перемещение, использование.
 - UI-интерфейс: Графическая часть, через которую игрок будет взаимодействовать с инвентарем.
 - Ограничения: Максимальное количество слотов и возможность складывания одинаковых предметов.
 
2. Структура проекта
Создадим следующие компоненты в Unity:
- Скрипты: Inventory, InventorySlot, Item.
 - Префабы: Слоты и элементы UI для отображения предметов.
 - Canvas: Панель инвентаря.
 - Менеджер предметов: Класс для управления логикой взаимодействия с предметами.
 
3. Реализация системы инвентаря
3.1 Скрипт Item
Создадим класс, описывающий предмет:
using UnityEngine;
// ScriptableObject для описания базовых данных предмета
[CreateAssetMenu(fileName = "New Item", menuName = "Inventory/Item")]
public class Item : ScriptableObject
{
public string itemName; // Название предмета
public Sprite icon; // Иконка предмета
public bool isStackable; // Можно ли складывать в стопки
// Метод, который может быть переопределен для уникальных действий с предметом
public virtual void Use()
{
Debug.Log($"Использован предмет: {itemName}");
}
}
Дополнительно: Можно добавить параметры, такие как вес, тип предмета или редкость.
3.2 Скрипт InventorySlot
Каждый слот будет хранить информацию о предмете:
using UnityEngine;
using UnityEngine.UI;
// Класс для управления отдельным слотом инвентаря
public class InventorySlot : MonoBehaviour
{
public Image icon; // Иконка предмета
public Button removeButton; // Кнопка удаления предмета
private Item item; // Хранимый предмет
// Метод для добавления предмета в слот
public void AddItem(Item newItem)
{
item = newItem;
icon.sprite = item.icon;
icon.enabled = true;
removeButton.interactable = true;
}
// Метод для очистки слота
public void ClearSlot()
{
item = null;
icon.sprite = null;
icon.enabled = false;
removeButton.interactable = false;
}
// Метод для удаления предмета по нажатию кнопки
public void OnRemoveButton()
{
Inventory.instance.Remove(item);
}
// Метод для использования предмета
public void UseItem()
{
if (item != null)
{
item.Use(); // Вызываем действие предмета
}
}
}
Совет: Добавьте проверку на null, чтобы избежать ошибок при взаимодействии.
3.3 Скрипт Inventory
Основной класс для управления инвентарем:
using System.Collections.Generic;
using UnityEngine;
// Класс инвентаря для управления предметами
public class Inventory : MonoBehaviour
{
public static Inventory instance; // Синглтон для удобного доступа
private void Awake()
{
if (instance != null)
{
Debug.LogWarning("Inventory уже существует!");
return;
}
instance = this;
}
public List<Item> items = new List<Item>(); // Список предметов в инвентаре
public int space = 20; // Максимальное количество предметов
// Делегат для уведомления об изменениях в инвентаре
public delegate void OnItemChanged();
public OnItemChanged onItemChangedCallback;
// Метод для добавления предмета
public bool Add(Item item)
{
if (items.Count >= space)
{
Debug.Log("Нет места в инвентаре!");
return false;
}
items.Add(item);
onItemChangedCallback?.Invoke(); // Уведомляем об изменениях
return true;
}
// Метод для удаления предмета
public void Remove(Item item)
{
items.Remove(item);
onItemChangedCallback?.Invoke(); // Уведомляем об изменениях
}
}
Дополнительно: Можно добавить логику объединения предметов и проверки уникальности.
3.4 Интерфейс инвентаря
Создание Canvas
- Добавьте Canvas в сцену:
 
- В Unity на верхней панели выберите GameObject > UI > Canvas.
 - Canvas автоматически создаст Event System, если его ещё нет в сцене.
 
- Настройте Canvas:
 
- Убедитесь, что Render Mode установлен в Screen Space - Overlay.
 - Добавьте подходящий фон или панель для оформления интерфейса инвентаря.
 
- Создайте Grid Layout Group:
 
- Добавьте пустой объект в Canvas (правый клик на Canvas > Create Empty).
 - Назовите его InventorySlotsParent.
 - Перейдите в Inspector и добавьте компонент Grid Layout Group.
 - Настройте параметры Grid Layout Group (отступы, размер ячеек, расстояние между ними) в соответствии с дизайном.
 
- Создайте префаб для слотов:
 
- Создайте пустой объект в сцене и добавьте компонент Button.
 - Добавьте дочерний объект Image для отображения иконки предмета.
 - Настройте размеры и расположение Button и Image.
 - Сохраните объект как префаб в папке проекта (например, Assets/Prefabs/InventorySlot.prefab).
 - Удалите временный объект из сцены.
 
Скрипт InventoryUI
Этот скрипт будет обновлять интерфейс инвентаря:
using UnityEngine;
// Класс для обновления UI инвентаря
public class InventoryUI : MonoBehaviour
{
public Transform itemsParent; // Родитель слотов
public Inventory inventory;
private InventorySlot[] slots; // Массив слотов
void Start()
{
inventory.onItemChangedCallback += UpdateUI; // Подписываемся на изменения инвентаря
slots = itemsParent.GetComponentsInChildren<InventorySlot>(); // Получаем все слоты
}
// Метод для обновления интерфейса
void UpdateUI()
{
for (int i = 0; i < slots.Length; i++)
{
if (i < inventory.items.Count)
{
slots[i].AddItem(inventory.items[i]); // Заполняем слот
}
else
{
slots[i].ClearSlot(); // Очищаем слот
}
}
}
}
Дополнительно: Добавьте визуальные эффекты при взаимодействии с предметами.
4. Расширение системы
- Сортировка предметов: Добавьте алгоритм сортировки по типу, имени или редкости.
 - Взаимодействие с игровым миром:
 
- Реализуйте триггеры для подбора предметов.
 - Добавьте выпадение предметов из объектов.
 
- Сохранение данных: Используйте JSON, PlayerPrefs или ScriptableObjects для сохранения инвентаря.
 - Объединение слотов: Реализуйте логику для объединения одинаковых предметов.
 - Улучшенный UI: Добавьте анимации открытия инвентаря и подсказки при наведении.
 
5. Заключение
Мы создали базовую систему инвентаря, которая позволяет добавлять, удалять и использовать предметы, а также взаимодействовать с интерфейсом. Эта структура легко расширяется для более сложных игр. Экспериментируйте, добавляйте новые функции и делайте ваш инвентарь уникальным!
Подпишись и поставь лайк :)
Так же: Оптимизация производительности в Unity: практические советы