Как создать простой инвентарь в Unity
2026-02-21 01:02 Diff

#Руководства

  • 31 июл 2019
  • 0

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

 vlada_maestro / shutterstock

Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.

В компоненте 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». Вы научитесь создавать все основные компоненты для игры и сможете работать над крупными проектами.

Научитесь: Профессия Разработчик игр на Unity с нуля Узнать больше