Как создать простой инвентарь в Unity

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

Чтобы реализовать инвентарь, нужно уже уметь создавать простые игры и работать с интерфейсами.

Как создать окно инвентаря

Добавьте на карту элементы Canvas с именем InventoryCanvas и Panel, в котором будут находиться остальные элементы:

Евгений Кучерявый

Пишет о разработке сайтов, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые 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 — главный язык гейм-девелопмента. Изучив его основы, вы сможете дальше развиваться в игровой индустрии, а со временем даже устроиться на работу в студию мечты или стать инди-разработчиком. Это универсальный движок для создания игр для компьютеров, консолей и мобильных устройств, самый востребованный на рынке.

Хочешь получать крутые статьи по программированию?
Подпишись на рассылку Skillbox