В этой статье мы рассмотрим процесс создания простого инвентаря в 3D проекте и настройки его графического отображения. В качестве примера мы будем использовать бесплатные ассеты Unity.
Для Вашего удобства мы будем описывать последовательность шагов текстом и демонстрировать эти шаги в кратком видео. И так, приступим.
Нам понадобятся такие ассеты:
Подготовка проекта
- Импортируйте ассеты, перечисленные выше.
- Создайте куб (в окне иерархии нажмите “+” -> 3D object -> Cube):
- Переименуйте его в “Ground”, и увеличьте Scale по x и y:
- Создайте персонажа (Invector -> Basic Locomotion -> Create Basic Controller)
- Откроется окно создание персонажа, выберите в нем VBOT2.0_Custom и Invecor@BasicLocomotion и нажмите “Create”
- Поместите полученного персонажа над землей, запустите игру и убедитесь, что всё работает
Логика создания инвентаря
- Создайте скрипт “Inventory” в Папке “MonoBehaviour”
2. Создайте скрипт “Item” в папке “Scriptable objects”
3. Открываем скрипт “Item”, все предметы, которые мы будем создавать будут наследоваться от этого класса. Он будет наследоваться от ScriptableObject и содержать несколько полей (вы можете добавить какие-то поля по своему желанию):
4. Открываем скрипт “Inventory”, он будет прикрепляться к игроку и содержать список предметов. Создаем класс InventorySlot, он будет содержать предмет и количество экземпляров этого предмета в инвентаре. Определяем функцию добавления предмета в инвентарь, она сначала будет проверять, есть ли уже предмет с таким ID в инвентаре, в случае, если есть увеличивать их количество, а если нет – добавлять новый.
Собирание предметов
- Создадим кубик, а так же для наглядности сделаем его зеленым. Для этого создадим папку “Materials”, там создадим новый материал и поменяем его цвет (Alberdo)
- На кубике создадим коллайдер, сделаем его триггером, он будет определять, достаточно ли близко игрок подошёл к предмету, чтобы его поднять
- Создадим и добавим на него скрипт “CollectableItem”
- Если к предмету приближается кто-либо, у кого есть инвентарь – предмет добавляется в него и пропадает со сцены
- Для проверки работоспособности инвентаря добавим строчку [CreateAssetMenu] перед определением класса Item
- Затем создадим папку “Items” в папке “Project”, а в ней создадим предмет:
- Выберете для него понравившуюся вам иконку из скачанных ранее
- Добавьте его в качестве предмета на наш кубик
- Добавьте инвентарь нашему персонажу
- Запустите игру и подойдите к предмету, он должен исчезнуть, а в инвентаре персонажа должен появиться предмет.
- Инвентарь готов, осталось, лишь сделать его графическое отображение.
UI инвентаря
- Создаём Canvas
- Переходим в 2D режим
- Создаем Panel
- Создадим 4 “Image” и сделаем так, чтоб каждый из них занимал четверть панели.
- Добавим ограничение на количество предметов в инвентаре:
6. Создадим событие, которое будет вызываться при добавлении предмета в инвентарь
7. На панели создадим скрипт “Inventory UI”, он будет отвечать за графическое отображение инвентаря
8. Этот скрипт будет содержать метод UpdateUI, который будет принимать инвентарь и устанавливать изображения предметов. Так же необходимо добавить методы получения предмета в Inventory
9. Положим все Image в список
10. Теперь нам необходимо вызывать этот метод всякий раз, когда обновляется содержимое инвентаря, как раз для этого мы и создали событие OnInventoryChanged. Добавляем вызов нашего метода в это событие.
11. Делаем цвета всех Image прозрачными
12. Запускаем игру и убеждаемся, что подобранный предмет отображается в инвентаре
13. Осталось только сделать отображение количества предметов. Для этого к каждой картинке добавляем текстовое поле. Дополним скрипт UpdateUI, добавив туда отображение количества предметов, а так же делая пустые слоты прозрачными.
Заполняем список текстов
Создаем различные предметы (ВАЖНО: ID предметов должны быть различны) и тестируем
В данном уроке мы рассмотрели вариант создания инвентаря при помощи Scriptable Object. UI инвентаря – лишь тестовый вариант отображения, вы можете переделать его на свой вкус, так же можно сделать дополнительный класс для того, чтоб Image и Text не были отдельными списками, сделать инвентарь бесконечным, добавить возможность убирать предметы из инвентаря, сделать разные типы предметов наследуя их от Item и тд.
Как сделать так, что бы была возможность выкинуть предметы из инвентаря, были те предметы которые можно брать в единичном экземпляре?
Проконсультируйтесь пожалуйста через my.first.unity.help@gmail.com
Доброго времени суток! На этапе 6. возникла подобная проблема: появилась ошибка error CS0246: The type or namespace name ‘UnityEvent’ could not be found (are you missing a using directive or an assembly reference?)
Каким образом можно это исправить?
Проконсультируйтесь пожалуйста через почту: my.first.unity.help@gmail.com
using UnityEngine.EventSystems;
Попробуй подключить, должно помочь)
Здравствуйте! Статья выглядит полезной, но пробовал создать инвентарь полностью на ее основе и возникли проблемы с отображением иконки предмета, не могли бы вы подсказать в чем может быть проблема? Из видимых проблем при касании коллайдера предмет собирается и добавляется в список items, но его иконка не появляется в ячейке, хотя она привязана к scriptableObject и еще при дебаге список amounts всегда не содержит элементов, как будто Text не считается за элемент совсем.
By the way, у вас в некоторых клипах содержатся данные, которые на скриншотах располагаются после этих клипов, проверьте пожалуйста, это немного сбивает с толку)
Проконсультируйтесь пожалуйста через почту: my.first.unity.help@gmail.com