Как сделать инвентарь в unity
Перейти к содержимому

Как сделать инвентарь в unity

  • автор:

Создание инвентаря персонажа в Unity

Сделать инвентарь не то чтобы сложно, но есть некоторые трудности, которые мы сегодня будем решать. Конечная цель – возможность перетаскивать объекты в ячейки инвентаря, и перетаскивать их из инвентаря обратно в игровой мир. Общая логика такова. В игре есть предметы, которые можно положить, например, в рюкзак. При клике по предмету, его 3D модель – меняется на соответствующую 2D иконку, которую мы можем перемещать на экране. Иконку можно положить в ячейку рюкзака, можно переназначать ячейки, то есть перекладывать иконку с места на место. Далее, любую иконку из инвентаря можно вытащить и переместить в 3D пространство, где она будет заменена на соответствующую 3D модель. Вот, как-то так..

Примечание: есть разные варианты реализации инвентаря, с использованием загрузки из папки Resources например. Здесь несколько иной способ, с использованием id объектов. Плохо это или хорошо, решайте сами. В любом случаи это лишь пример, который можно улучшить или взять на вооружение отдельные его части.

Подготовка:
Во-первых, нарисуйте ячейку рюкзака, и именуем иконку как background. Создаем новый UI объект типа Canvas не меняя настройки по умолчанию, а в него добавляем объект типа Image, в качестве источника изображения — делаем иконку ячейки. Настраиваем размер. Теперь, дублируем эту картинку, переименуем в item, затем, делаем дубликат — дочерним оригиналу. Переходим к настройке дочернего объекта. Цепляем на него небольшой скрипт Grid:

Он хранит информацию о номере ячейки, а так же о id массивов предметов и иконок, плюс, текущая активность. Дополнительно две функции, которые будет запускать обработчик событий, чтобы передавать информацию другому скрипту.

Продолжим. На дочерний объект добавим обработчик событий Add Component > Event > Event Trigger. В обработчик мы добавим два события PointerEnter и PointerExit. Обращаться будем к текущему скрипту Grid на этой картинке. Для PointerEnter — функция SetID, для PointerExit — функция ResetID. Как показано на скриншоте ниже:

Создание инвентаря персонажа в Unity

Настройка ячейки готова. Теперь клонируем родителя и укладываем объекты, делаем рюкзак. Делаем пустой UI, назем его Inventory и перемещаем туда все ячейки:

Внимание! В Inventory не должно быть вложено никаких других объектов, кроме ячеек.

На Inventory вешаем скрипт с таким же названием:

allItems — массив префабов предметов.

itemIcon — массив спрайтов иконок для предметов.

iconSize — размер иконки во время перемещения по экрану.

background — спрайт ячейки.

Как надо собирать префаб предмета. Во-первых, любой предмет который можно положить в инвентарь должен иметь скрипт AddToInventory:

itemID — номер для иконки и имени этого префеба.

То есть имя должно иметь вид id_XXX, например, 57_Book, здесь 57 это номер itemID. Разделительный знак «_». При создании иконки для данного предмета, ее имя должно иметь такой же вид, например, 57_BookIcon. Добавлять префабы предметов и спрайты иконок, в массивы, можно в любом порядке, потому что их фильтрация будет делаться по имени.

Создаём простой инвентарь в Unity

Приветствую начинающих разработчиков. Сегодня мы научимся создавать простой инвентарь для нашего персонажа. Данный инвертарь подойдёт как для 2д так и для 3д игр, но рассматривать реализацию инвентаря мы будем на примере 2д игры.

Создание макета для инвентаря

Первым делом подготовим наши UI элементы. Для этого с помощью окна Hierarchy создадим объект canvas(UI — Canvas), а в нём создадим 3 UI элемента:

  • UI — Panel: Обёртка для нашего слота. Дадим этому объекту название S1.
  • UI — Image: Сам слот, в котором будут хранится предметы. Дадим этому объекту название Slot1. Так же вложите данный объект внутр объекта S1.
  • UI — Button — TextMeshPro: Кнопка выброса предмета. Дадим этому объекту название Drop1. Так же вложите данный объект внутр объекта S1. Обратите внимание, что внутри данного объекта автоматически создастся и текст для кнопки, который необходимо удалить!

В результате в окне Hierarchy у Вас должно получится так:

Отлично, один слот готов. В нашем примере будет три слота, поэтому продублируйте всё то же самое 3 раза, переименовав объекты для ясности. Должно получится так.

Для слотов(Slot1, Slot2 и Slot3) и для кнопок выброса предметов(Drop1, Drop2 и Drop3) я присвоил картинки простого инвентаря. Теперь весь наш инвентарь на сцене выглядит так:

Отлично! Подготовительная часть завершена, теперь перейдём к написанию наших любимых скриптов. Начнём с самого простого скрипта, который будет отвечать за наш инвентарь. Создадим скрипт C# и назовём его Inventory, и сразу же перетащим его для нашего главного персонажа.

Содержимое скрипта будет следующим:

Как видите, скрипт очень маленький. Он хранит только 2 массива:

  • isFull хранит массив значений true/false, то-есть информация о том, заполнен ли слот или нет.
  • slots хранит массив слотов, которые мы только что создали(Slot1, Slot2 и Slot3).

Так же предлагаю заранее настроить данный скрипт(компонент) в окне Inspector:

  • Укажите количество слотов равное трём.
  • Перетащите все ваши слоты из окна Hierarchy в поля slots окна Inspector.

Работа с инвентарём завершена. Давайте теперь создадим объекты, которые можно будет подбирать нашим персонажем в инвентарь. Для этой цели я создам 2 разных объекта, например, яблоко и банан. Добавим для них компоненты Rigidbody 2D, и любой из 2D Collider-ов. Внутри компонента коллайдера, в поле Is Trigger поставим галочку для того, чтобы этот предмет можно было подбирать.

Поскольку с этими предметами мы будем довольно часто сталкиваться, то данные объекты сохраним в виде префабов, с названиями Apple и Banan.

Так же для яблока и банана нужно создать ещё по одному префабу, которые будут являться картинками, и появляться/исчезать в наших слотах инвентаря. Поскольку это не игровые объекты, а всего лишь картинки, то в основе этих префабов должны быть UI элементы, то-есть, UI — Image. Компоненты Rigidbody и Collider создавать НЕ нужно! Назовём эти префабы ItemApple и ItemBanan.

В результате у Вас должно получится 2 префаба для игровых объектов, которые персонаж может подбирать, и 2 префаба картинок для инвентаря.

Подбор предметов в инвентарь

Теперь необходимо создать скрипт, который будет отвечать за подбор объектов. Он должен удалять подобранные предметы из игровой сцены, и создавать картинку подобранного предмета в инвентаре.

Для этого создадим скрипт C# с названием Pickup, и заранее присвоим его к тем объектам, которые могут быть подобраны нашим персонажем, а именно, к двум нашим префабам, яблоке и банану, которые имеют названия Apple и Banan.

Теперь пропишем в только что созданный скрипт Pickup следующий код:

В строке #5 мы создали переменную inventory, в которой будем хранить ссылку на скрипт(клмпонент) нашего инвентаря. А в строке #10 с помощью метода FindGameObjectWithTag(), мы осуществляем поиск по тегу Player, и потом с помощью GetComponent() получаем доступ к компоненту Inventory. Важно: Присвойте тег Player для вашего главного персонажа!

В строке #6 мы создали переменную slotButton, которая будет хранить ссылку на префаб картинки инвентаря. Это нужно для того, чтобы указать, какая картинка будет создаваться в инвентаре, при подборе яблока или банана. Подбираем яблоко — создаётся картинка яблока. Подбираем банан — создаётся картинка банана.

Поскольку наш скрипт уже присвоен к яблоке и банану(Apple и Banan), то давайте в окне Inspector настроим данный скрипт для этих объектов:

  • Выбрав префаб Apple, необходимо в поле slotButton компонента Pickup, перетащить префаб картинки яблока(ItemApple).
  • Выбрав префаб Banan, необходимо в поле slotButton компонента Pickup, перетащить префаб картинки банана(ItemBanan).

Пример настройки объекта яблока представлен на картинке ниже:

Продолжим разбирать код. В строках #13-28 с помощью метода OnTriggerEnter2D() мы проверяем, вошёл ли какой-либо объект в область нашего коллайдера, и если тег данного объекта Player, то с помощью цикла for, мы проходим по всем слотам! В данном цмкле мы провеяем, если слот пустой, то производим 4 следующих действия:

  • С помощью метода Destroy() удаляем наш объект из игровой сцены, который мы только что подобрали (строка #21).
  • С помощью метода Instantiate() в нашем инвентаре создаём объект из префаба slotButton (строка #22).
  • Указываем, что данный слот в инвентаре не пустой (строка #23).
  • Завершаем принудительно цикл, во избежании проблем (строка #24).

Так же обратите внимание, что выполнение всех этих действий происходит в том случае, если у вас имеется хотя бы 1 пустой слот. Если же все слоты в инвентаре будут заполнены, то этот код выполняться не будет.

Готово! Только что мы написали скрипт подбора предметов и запись его в инвентарь. На этом этапе рекоммендую запустить и протестировать работу скрипта, чтобы убедится, что вы всё сделали правильно. Если предметы удаляются из игровой сцены, и записываются в инвентарь, то всё сделано правильно, и можно идти дальше.

Выброска предметов из инвентаря

Теперь нужно создать скрипт выброса предмета, который делает всё с точностью до наоборот. То-есть, удаляет предмет из инвентаря, и создаёт его на игровой сцене. Для этого создадим скрипт с названием Spawn, и заранее присвоим его нашим префабам ItemApple и ItemBanan.

Содержимое данного скрипта следующее:

В строке #5 мы создали переменную item, которая будет хранить ссылку на префаб подбираемого объекта. Это нужно для того, чтобы указать, какой объект будет создаваться на игровой сцене, при выброске предмета из инвентаря. Выбрасываем яблоко — создаётся объект яблока. Выбрасываем банан — создаётся объект банана.

В строке #6 мы создали переменную player, в которой будем хранить координаты нашего главного персонажа. Это нужно для того, чтобы понимать, в каком месте пространства создавать выброшенный объект. А в строке #10 мы как раз и присваиваем данной переменной ссылку на координаты игрока.

Ну и самое главное! Мы создали метод SpawnDroppedItem(), который и будет создавать наш подбираемый объект на игровой сцене, и удалять картинку выброшенного предмета из инвентаря. Метод SpawnDroppedItem() должен вызываться при нажатии на кнопку выброса предмета. Поэтому давайте создадим дополнительный скрипт для этого.

Создадим скрипт C# с названием Slot, и заранее присвоим его ко всем нашим слотам(Slot1, Slot2 и Slot3). Содержимое данного скрипта следующее:

Как и в предыдущих примерах, в строке #5 и в #10 мы создали переменную, в которой хранится ссылка на инвентарь нашего персонажа. А в строке #6 мы будем хранить уникальный номер для каждого нашего слота в переменной id. Поэтому предлагаю заранее в окне Inspector для каждого нашего слота проставить номера, начиная с 0:

  • Для Slot1 в поле id поставим 0.
  • Для Slot2 в поле id поставим 1.
  • Для Slot3 в поле id поставим 2.

Мы так же написали функцию DropItem(), которая будет запускать функцию SpawnDroppedItem() из скрипта Spawn. Функцию DropItem() нам нужно запускать после нажатия на кнопку выброса предмета из ячейки. Поэтому нам необходимо для кнопок Drop1, Drop2 и Drop3, в окне Inspector добавить события On Click, перетащив туда объекты Slot1, Slot2 и Slot3 соответственно, и выбрать метод Slot.DropItem.

Отлично, для каждой нашей кнопки мы присвоили запуск функции DropItem(), которая в свою очередь запускает функцию SpawnDroppedItem() из скрипта Spawn, которая в свою очередь и выбрасывает предметы из инвентаря на игровую сцену.

Статья получилась очень большой, и я очень рад, что наконец-то её завершил. Буду рад вашим лайкам. А если остались вопросы, пишите в комментариях.

Создание простого инвентаря в игре на Unity.

Инвентарь — это элемент в игре, который позволяет управлять различными вещами персонажа, которые в свою очередь выдают различные плюшки. Плюшками могут быть: дополнительное здоровье, броня, урон от оружия и прочее. Сейчас невозможно представить ни одну игру без инвентаря, поскольку данный элемент невероятно сильно открывает возможности как для разработчика, так и для игрока.

Инвентарь

Инвентарь бывает различных типов. Так, например, в Skyrim’e используется инвентарь в виде списка. А в другой не менее известной игре – Minecraft, реализован сетчатый.

Создание простого инвентаря в игре на Unity. Инвентарь - Minecraft

Наш инвентарь конечно же будет менее функционален чем в этих двух играх, но его работоспособность будет напрямую завесить от ваших сил. Приступим.

Дизигнем инвентарь.

Для примера будет разобран инвентарь из разрабатываемой мною игрой DarkCaves.

Инвентарь - дизайн

Не пугайтесь столь ужасного дизайна, думаю у вас он будет лучше. Разберёмся что присутствует на сцене:

  • Левые ячейки для вещей
  • Правые ячейки для вещей

Левые ячейки необходимы, чтобы отображать вещи персонажа, которые становиться активными и дают какие-либо свойства. Правые служат отображением всех вещей персонажа.

Инвентарь - иерархия

Вам стоит создать нечто подобное, разделив ячейки на две группы. Ах да, стоило бы сказать, что ячейка – это обычный объект с компонентом image.

Инвентарь - настройка ячеек

Когда всё будет готово, создаём новый скрипт, назвав его InventoryManager. Данный скрипт будет отвечать за всю логику инвентаря.

Пишем скрипт для перемещения фишек

Для начала нам стоит создать несколько функций. Первая функция будет отвечать за наведение на клетку, а вторая за сведение курсора мыши с этой клетки.

Создадим также переменные, которые будут необходимы для управления скриптом.

Немного разберёмся, что, зачем и почему:

  • Items – это массив класса в котором будут содержаться различные характеристики о вещи, например сколько она добавляет здоровья, брони, и прочее. На данный момент я не стал этого вносить, поскольку это бы заняло невероятно много времени.
  • cells – массив ячеек инвентаря, которые были созданы ранее, они нужны для того, чтобы прикреплять объект вещи к конкретной точке, а не в пространстве.
  • canvas – элемент, необходимый для перемещения вещи.
  • activeCell и oldActiveCell – переменные для расчётов.

Следующая функция, которая необходима для работы скрипта – это Update.

Разберёмся, что здесь происходит. В первую очередь, мы проверяем нажатие на клавишу мыши. Если нажатие было произведено, то мы проверяем, был ли наведён курсор на какую-то из ячеек. Если такое произошло, запоминаем номер данной ячейки и меняем родителя у объекта.

Далее происходит проверка на постоянное нажатие клавиши мыши. Если клавиша мыши зажата, и у нас был зафиксирован номер ячейки, мы вычисляем координаты курсора и перемещаем ячейку в их позицию.

Ну и последнее что происходит в этой функции, это проверка не была ли отжата клавиша мыши. Если такое произошло, мы проверяем был ли наведён курсор на ячейку, и не лежит ли в этой ячейке какой-либо элемент. Если все условия соблюдены, элемент перемещается в данную ячейку инвентаря, если нет – возвращается обратно.

На этом написание скрипта закончено, осталось только настроить сцену.

Настройка сцены для скрипта.

Для начала закинем скрипт на какой ни будь объект на сцене.

Инвентарь - настройка скрипта

Далее необходимо создать image, и расположить его внутри одной из ячеек, выставив следующие настройки:

Инвентарь - настройка вещей

На сами ячейки необходимо добавить компонент EventTrigger и указать у него следующие настройки. Не запутайтесь с id ячейки. Необходимо начать с 0, далее 1, 2, 3 …

Инвентарь - триггер на ячейке

Предпоследним действием нужно добавить Image в переменную скрипта. Поскольку у меня 18 ячеек, я создал массив из 18 элементов. Где 17 позиций пустые и только лишь в первом указана вещь.

Инвентарь - настройка вещей 2

Осталось лишь указать 18 позиций, на которые перемещаются вещи:

Инвентарь - настройка скрипта 2

На этом разработка инвентаря для перемещения закончена. Если вы всё сделали правильно, то при перетаскивании Image, вы можете наблюдать за тем, как элемент подстраивается под курсор и при отпускании в другую ячейку принимает её позицию.

Как сделать инвентарь в Unity. Уроки Unity для детей и подростков

Мы покажем, как сделать так, чтобы подобранные персонажем предметы (оружие, золото) попадали в инвентарь.

Инвентарь — одна из тех фич, которые могут хорошо разнообразить вашу игру. Вы можете разбросать по игровой карте оружие или награды, чтобы герой собирал их в свою коллекцию.

В этом уроке школа «Пиксель» расскажет, как сделать инвентарь в Юнити: мы расставим предметы на сцене и напишем специальный скрипт на С#. Наш персонаж будет подбирать стрелы, меч и золотые слитки. Необходимые материалы для урока (спрайты) вы найдете здесь.

Мы также сделали подробную видеоинструкцию, если такой формат вам нравится больше (в конце статьи).

Сначала мы создаем plane и добавляем на него sphere — этот объект и будет нашим героем. Сразу на сферу мы добавляем компонент Physics.

Затем расставляем на сцене три куба — эти объекты будут отображать предметы, которые наш персонаж должен собирать в свой инвентарь. Далее нам нужно создать три материала, перекрасить их в любые понравившиеся вам цвета и назначить по одному из них каждому кубу на сцене.

Чтобы нам было проще определить, какой предмет мы подобрали, соприкоснувшись с кубом, добавляем три тега: для стрел, меча и золота. Затем назначаем эти теги: например, желтым будет золото, красным — стрелы, а фиолетовым — меч.

Для куба нам тоже нужно назначить тег, а также поставить у него галочку в коллайдере IsTrigger.

Теперь сделаем сам инвентарь. Сначала создаем канвас (Canvas), а на нем — панель. Уменьшаем панель в размере. Затем добавляем на нее три изображения (компонент Image), масштабируем их и располагаем на сцене. Должно получиться три окошка.

Щелкаем правой кнопкой мыши, выбираем Create и создаем скрипт на языке С# (Си Шарп). Называем его GameManager. Объявляем два массива: массив изображений, которые видны на канвасе, и массив спрайтов, которые будут загружать в компонент Image.

Затем создаем метод OnTriggerEnter и делаем проверку на три тега: стрелы, золото и меч.

Сохраняем. Не забываем также в самом начале скрипта добавить пространство имен, чтобы наши массивы заработали.

Перемещаем скрипт на нашего персонажа. После этого у нас справа появились два массива, которые нужно заполнить: три элемента Image и три элемента спрайта. Переносим объекты на элементы Image и картинки — на элементы спрайта. Важно запомнить последовательность: под 0 у нас стрелы, под 1 — золото, а под 2 — меч.

Возвращаемся в скрипт. Теперь нам нужно назначить изображения: например, в первом случае, так как у нас идет проверка на стрелы, нам нужно подгрузить изображение стрел. То есть мы в нулевой элемент массива изображений ставим картинку под номер 0. То же самое с золотом и мечом.

Осталось проверить. Запускаем Юнити. Настраиваем камеру так, чтобы было хорошо видно происходящее на сцене. Мы переместим ее в сферу, чтобы она следовала за нашим персонажем.

Вот такой урок у нас получился. Добавляйте инвентарь в свои игры на Юнити и продолжайте изучать эту среду разработки.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *