Пример системы инвентаря с управление предметами в Unity

/

Раздел: ,

Создание системы инвентаря — важная часть разработки игры, особенно если она включает в себя управление предметами. В этой статье мы рассмотрим, как создать систему инвентаря с возможностью добавления, удаления, перемещения и использования предметов. Также мы создадим интерфейс, который позволит игроку взаимодействовать с предметами в игре.

Инвентарь в Unity

1. Планирование системы инвентаря

Прежде чем приступать к коду, важно определить ключевые компоненты:

  1. Типы предметов:
  • Простые ресурсы (например, золото, еда).
  • Объекты, которые занимают слоты в инвентаре (например, оружие, броня).
  1. Слоты инвентаря: Ячейки, которые могут содержать предметы.
  2. Действия с предметами: Добавление, удаление, перемещение, использование.
  3. UI-интерфейс: Графическая часть, через которую игрок будет взаимодействовать с инвентарем.
  4. Ограничения: Максимальное количество слотов и возможность складывания одинаковых предметов.

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

  1. Добавьте Canvas в сцену:
  • В Unity на верхней панели выберите GameObject > UI > Canvas.
  • Canvas автоматически создаст Event System, если его ещё нет в сцене.
  1. Настройте Canvas:
  • Убедитесь, что Render Mode установлен в Screen Space - Overlay.
  • Добавьте подходящий фон или панель для оформления интерфейса инвентаря.
  1. Создайте Grid Layout Group:
  • Добавьте пустой объект в Canvas (правый клик на Canvas > Create Empty).
  • Назовите его InventorySlotsParent.
  • Перейдите в Inspector и добавьте компонент Grid Layout Group.
  • Настройте параметры Grid Layout Group (отступы, размер ячеек, расстояние между ними) в соответствии с дизайном.
  1. Создайте префаб для слотов:
  • Создайте пустой объект в сцене и добавьте компонент 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. Расширение системы

  1. Сортировка предметов: Добавьте алгоритм сортировки по типу, имени или редкости.
  2. Взаимодействие с игровым миром:
  • Реализуйте триггеры для подбора предметов.
  • Добавьте выпадение предметов из объектов.
  1. Сохранение данных: Используйте JSON, PlayerPrefs или ScriptableObjects для сохранения инвентаря.
  2. Объединение слотов: Реализуйте логику для объединения одинаковых предметов.
  3. Улучшенный UI: Добавьте анимации открытия инвентаря и подсказки при наведении.

5. Заключение

Мы создали базовую систему инвентаря, которая позволяет добавлять, удалять и использовать предметы, а также взаимодействовать с интерфейсом. Эта структура легко расширяется для более сложных игр. Экспериментируйте, добавляйте новые функции и делайте ваш инвентарь уникальным!

Подпишись на телеграм HAKSTER

Так же: Оптимизация производительности в Unity: практические советы