Как создать простой инвентарь в Unity
Инвентарь — одна из важнейших деталей игр многих жанров. Однако создать его может быть не так просто, как кажется на первый взгляд.


vlada_maestro / shutterstock
Чтобы реализовать инвентарь, нужно уже уметь создавать простые игры и работать с интерфейсами.
Как создать окно инвентаря
Добавьте на карту элементы Canvas с именем InventoryCanvas и Panel, в котором будут находиться остальные элементы:

В компоненте Canvas Scaller укажите в UI Scale Mode вариант Scale With Screen. Так размер инвентаря будет зависеть от разрешения экрана. Внутри Panel создайте еще одну панель и назовите ее Items:

Поменяйте цвет и добавьте компонент Grid Layout Group — он позволит расположить компоненты по сетке. Можно указать отступы и размер клеток. Затем добавьте название окна — это еще одна панель с текстом.

Теперь пора приступить к созданию ячеек. Внутри панели Items создайте кнопку и назовите ее Slot. Внутрь кнопки добавьте Image и назовите этот элемент Icon — в нем будет отображаться спрайт предмета. Также создайте пустой скрипт Slot.cs, а потом сохраните слот как префаб.
После этого можно создать несколько копий ячейки, которые автоматически расположатся по сетке.

Теперь нужен скрипт, который будет отвечать за открытие и закрытие инвентаря и другой функционал, — Inventory.cs. Прикрепите его к InventoryCanvas.
public class Inventory : MonoBehaviour
{
private Canvas canvas;
void Start()
{
canvas = GetComponent<Canvas>(); //Получение компонента Canvas
canvas.enabled = false; //Отключение инвентаря при старте
}
void Update()
{
if (Input.GetKeyDown(KeyCode.I))
{
canvas.enabled = !canvas.enabled; //При нажатии на кнопку I окно будет отображаться или скрываться
}
}
}
Вот как это выглядит:

Как создать предмет
Рассмотреть создание предметов можно на примере брони для танка. Она будет выглядеть так:

А на танке крепится так:

Для начала перетащите спрайт на карту и добавьте ему коллайдер с триггером:

Триггер нужен, чтобы его объект можно было «подбирать», наезжая на него. Добавьте скрипт Item.cs:
public class Item : MonoBehaviour
{
public int index = 0; //Номер предмета, в этой игре будет всего 3 типа брони, поэтому писать более сложный скрипт нет смысла
void OnTriggerEnter2D(Collider2D obj) //«Наезд» на объект
{
if (obj.transform.tag == "Player")
{
obj.GetComponent<Items>().AddItem(index);//Если наехал игрок, то он сможет подобрать предмет
Destroy(gameObject); //Удаление объекта с карты
}
}
}
Вот как будет выглядеть подбор предмета:

Пока скрипт Items.cs не создан, поэтому попытка его вызова может привести к ошибке — закомментируйте строку obj.GetComponent<Items>().AddItem (index);
Как подобрать предмет
Создайте скрипт Items.cs и добавьте его персонажу:
public class Items : MonoBehaviour
{
public int[] items = new int[] { 0, 5, 10, 15, 20, 25 };
public bool[] hasItems = new bool[] { true, true, false, false, false, false };
private int currItem = 0;
public int defence = 0;
public GameObject armorObject;
public Sprite[] sprites;
public void Equip(int index)
{
if (hasItems[index])
{
currItem = index;
defence = items[currItem];
armorObject.GetComponent<SpriteRenderer>().sprite = sprites[currItem];
}
}
public void AddItem(int index)
{
hasItems[index] = true;
}
}
Перед запуском игры нужно немного изменить персонажа. Создайте пустой объект и перетащите ему все компоненты персонажа. Сам же спрайт поместите внутрь этого объекта. Также нужно создать объект Armor — ему будет задаваться спрайт текущей брони:

Как добавить предмет в инвентарь
Теперь нужно сделать так, чтобы подобранные предметы отображались в инвентаре. Для этого добавьте вот такой код в скрипт Slot.cs:
public class Slot : MonoBehaviour
{
public Sprite sprite; //Спрайт брони для этого слота
public Image icon; //Иконка, куда будет прикрепляться спрайт
public void UpdateSlot(bool active) //Обновление слота
{
if (active)
{
icon.sprite = sprite;
}
else
{
icon.sprite = null;
}
}
}
Чтобы новый скрипт работал, нужно добавить новый функционал в Inventory.cs:
public class Inventory : MonoBehaviour
{
private Canvas canvas;
public GameObject player;
private Items items;
public Transform inventorySlots;
private Slot[] slots;
void Start()
{
canvas = GetComponent<Canvas>();
canvas.enabled = false;
items = player.GetComponent<Items>();
slots = inventorySlots.GetComponentsInChildren<Slot>(); //Получение всех ячеек
}
void Update()
{
if (Input.GetKeyDown(KeyCode.I))
{
UpdateUI(); //Обновление интерфейса
canvas.enabled = !canvas.enabled;
}
}
void UpdateUI()
{
for (int i = 0; i < slots.Length; i++) //Проверка всех предметов
{
bool active = false;
if (items.hasItems[i]) //Если такой предмет есть у пользователя, то он будет отображаться в слоте
{
active = true;
}
slots[i].UpdateSlot(active);
}
}
}
Вот как выглядит инвентарь с предметами:

Как надеть предмет
За надевание предмета будет отвечать скрипт Items:
public class Items : MonoBehaviour
{
public int[] items = new int[] { 0, 5, 10, 15, 20, 25 }; //Список характеристик предметов
public bool[] hasItems = new bool[] { true, true, false, false, false, false }; //Наличие предметов
private int currItem = 0; //Текущий предмет
public int defence = 0; //Защита
public GameObject armorObject;
public Sprite[] sprites;
public void Equip(int index) //Метод надевания предмета
{
if (hasItems[index]) //Если такой предмет есть
{
currItem = index;
defence = items[currItem];
armorObject.GetComponent<SpriteRenderer>().sprite = sprites[currItem]; //Изменение спрайта
}
}
public void AddItem(int index)
{
hasItems[index] = true; //Добавление предмета при подборе
}
}
Теперь метод Equip () нужно прикрепить к слоту и указать его номер. Первая ячейка должна идти под номером 0, вторая — под 1 и так далее:

Теперь пора проверить, как всё это работает:

Заключение
Инвентарь — достаточно сложный игровой компонент. В этой статье был разобран лишь минимальный функционал. Кроме него, можно реализовать еще много всего интересного: влияние предметов на характеристики персонажа, выкидывание предметов, передачу их другим игрокам, лут и многое другое.
Если вы хотите лучше изучить работу с Unity, записывайтесь на курс «Профессия разработчик игр на Unity». Вы научитесь создавать все основные компоненты для игры и сможете работать над крупными проектами.