Как создать простой инвентарь в Unity
Инвентарь — одна из важнейших деталей игр многих жанров. Однако создать его может быть не так просто, как кажется на первый взгляд.
![](https://248006.selcdn.ru/main/iblock/3fe/3fe61aba6e9dac6ad33d72a7545d1641/869190ad9d1ea90ba7263aa3af820e8e.png)
![](https://248006.selcdn.ru/main/iblock/3fe/3fe61aba6e9dac6ad33d72a7545d1641/869190ad9d1ea90ba7263aa3af820e8e.png)
vlada_maestro / shutterstock
Чтобы реализовать инвентарь, нужно уже уметь создавать простые игры и работать с интерфейсами.
Как создать окно инвентаря
Добавьте на карту элементы Canvas с именем InventoryCanvas и Panel, в котором будут находиться остальные элементы:
![](https://248006.selcdn.ru/main/upload/setka_images/14152030072019_e3ea06ecc4efe66fd609360c227a5daace25eda6.png)
В компоненте Canvas Scaller укажите в UI Scale Mode вариант Scale With Screen. Так размер инвентаря будет зависеть от разрешения экрана. Внутри Panel создайте еще одну панель и назовите ее Items:
![](https://248006.selcdn.ru/main/upload/setka_images/14152130072019_6a4e9b3ae3023faad72ace61e6264ce47ed78056.png)
Поменяйте цвет и добавьте компонент Grid Layout Group — он позволит расположить компоненты по сетке. Можно указать отступы и размер клеток. Затем добавьте название окна — это еще одна панель с текстом.
![](https://248006.selcdn.ru/main/upload/setka_images/14152130072019_db52642fc67f6c7c46657360f234a883af322464.png)
Теперь пора приступить к созданию ячеек. Внутри панели Items создайте кнопку и назовите ее Slot. Внутрь кнопки добавьте Image и назовите этот элемент Icon — в нем будет отображаться спрайт предмета. Также создайте пустой скрипт Slot.cs, а потом сохраните слот как префаб.
После этого можно создать несколько копий ячейки, которые автоматически расположатся по сетке.
![](https://248006.selcdn.ru/main/upload/setka_images/14152130072019_c3d4b76cd89b05f2c8e5da53f69c6d45806e9160.png)
Теперь нужен скрипт, который будет отвечать за открытие и закрытие инвентаря и другой функционал, — 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 окно будет отображаться или скрываться
}
}
}
Вот как это выглядит:
![](/upload/setka_images/14152130072019_f0646c625095b49e4e4c41332dd1408112ad8d69.gif)
Как создать предмет
Рассмотреть создание предметов можно на примере брони для танка. Она будет выглядеть так:
![](https://248006.selcdn.ru/main/upload/setka_images/14152130072019_7b64da46b2dc4329c15be64aeef9e636261e678c.png)
А на танке крепится так:
![](https://248006.selcdn.ru/main/upload/setka_images/14152130072019_4fb6fa4fbc0158ec7cf1e48acc6733dd567fe239.png)
Для начала перетащите спрайт на карту и добавьте ему коллайдер с триггером:
![](https://248006.selcdn.ru/main/upload/setka_images/14152130072019_93b8888c66d5103a8bb4f5fd89e04622d16558ec.png)
Триггер нужен, чтобы его объект можно было «подбирать», наезжая на него. Добавьте скрипт 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); //Удаление объекта с карты
}
}
}
Вот как будет выглядеть подбор предмета:
![](/upload/setka_images/14152130072019_48e955bcaa6ce26801c4639bf77f723f030656e1.gif)
Пока скрипт 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 — ему будет задаваться спрайт текущей брони:
![](https://248006.selcdn.ru/main/upload/setka_images/14152130072019_8bc1aa9ad985c6b5f9a267787eba176dd734e55f.png)
Как добавить предмет в инвентарь
Теперь нужно сделать так, чтобы подобранные предметы отображались в инвентаре. Для этого добавьте вот такой код в скрипт 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);
}
}
}
Вот как выглядит инвентарь с предметами:
![](https://248006.selcdn.ru/main/upload/setka_images/14152130072019_27e9aa5bdf801f94f7728fe14d1ac08405e5a691.png)
Как надеть предмет
За надевание предмета будет отвечать скрипт 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 и так далее:
![](https://248006.selcdn.ru/main/upload/setka_images/14152130072019_152245077ac6dbcf53ad14fb93a3bbc9c8bae8d3.png)
Теперь пора проверить, как всё это работает:
![](/upload/setka_images/14152130072019_60ddb9390c7c246f6f384c5280a3e2f296db8bec.gif)
Заключение
Инвентарь — достаточно сложный игровой компонент. В этой статье был разобран лишь минимальный функционал. Кроме него, можно реализовать еще много всего интересного: влияние предметов на характеристики персонажа, выкидывание предметов, передачу их другим игрокам, лут и многое другое.
Если вы хотите лучше изучить работу с Unity, записывайтесь на курс «Профессия разработчик игр на Unity». Вы научитесь создавать все основные компоненты для игры и сможете работать над крупными проектами.