Найти в Дзене
HAKSTER games | HSG

Пример системы инвентаря с управление предметами в 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: практические советы