ДевЛог #14 - Инвентарь

Предметы в игре уже можно было собирать, но дальше они исчезали в «никуда». Потому что никакого интерфейса и понимания что же было собрано нет. В этот момент игре срочно требуется инвентарь!

ДевЛог #14 - Инвентарь

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

Для начала надо было чётко понимать что же хочется получить, поэтому хотелки надо описать и разбить на подзадачи.

Хотелки

Разумеется инвентарь (как и любая сущность в игре) делится на логический и интерфейсный. Логический занимается тем, что всё хранит в памяти и всячески перетасосывает, а вот интерфейсный делает красивые подсказки при наведении, рисует иконки, и даже занимается драгэнддропом! Поэтому для начала я определился с тем, что я хочу получить от инвентаря:

  • Размер не ограничен и может задаваться от 1 до «сколькоугодно» ячеек
  • Многослотовые итема очень усложняют, поэтому не нужны
  • Управление мышкой
  • Каждый тип итема может уметь стекаться ограниченное кол-во раз
  • При подборе стека итемов они должны автоматом собираться в кучку
  • При попытке набросить один предмет поверх другого они меняются местами
  • Физическое расположение ячеек на экране не привязано к сетке и в целом неважно
  • Должно быть легко добавлять новые сущности
так это выглядит из самого Unity<br />
так это выглядит из самого Unity

Реализация

Реализация была разбита на 2 части, как и описано выше, сделаны они были независимо. В логической части были ячейки и итема, и в графической. После вёрстки интерфейсной части и реализации нескольких интерфейсов вроде IDragHandler и вообще подключения системы EventSystems всё уже работало само. Был итем и его можно было таскать:

ДевЛог #14 - Инвентарь

Интерфейс

Для возможности перестаскивания итема мне потребовался, как было сказано выше, EventSystems. На камеру был добавлен компонент Physics 2D Raycaster. Он-то и займётся определением на что в UI смотрит наш курсор.

UIItem, что лежит в слоте расширен интерфейсами IDragHandler, IBeginDragHandler, IEndDragHandler. Первый обрабатывает таскание, второй попытку начать тащить, а третий прекращение. Вся хитрость в данном месте была только в том, чтобы для итема, который тащим надо не забывать в begin отключать рейкаст, а в end включать назад. Иначе мы не сможем попасть им в слот!

Также для тултипа в UIItem реализованы интерфейсы IPointerEnterHandler, IPointerExitHandler. Они позволяют легко понять когда рейкастер столкнулся с итемом, чтобы сделать тултип видимым и заполнить данными.

UISlot реализует интерфейс IDropHandler и отслюда даёт команду уже логике на перемещение итема.

Логика

В логической части скриншотов особо не поделать, поэтому как оно всё работает получилось уже при соединении. Вся суть соединения была в том, чтобы залинковать графические ячейки с физическими и… и всё! Дальше всё работает согласно коду:

Работа проведена довольно большая и местами весьма сложная, но я доволен. Очень жду ваших вопросов\критики\пожеланий!

Как обычно чаще и больше информации в телеграмм-канале

55
8 комментариев

В упомянутом WoW есть коллекционные предметы, квеститемы, которые до Дренора, вроде, захламляли инвентарь
Каждый тип итема может уметь стекаться ограниченное кол-во раза использовать их оттуда можно или они просто валяются
Размер не ограничен и может задаваться от 1 до «сколькоугодно» ячеекдополнительно надо будет прикручивать фильтр поиска или какой-то принцип хранения, чтобы в количестве хлама можно было разобраться и быстро найти нужный итем. Ларианы, например, никак не победят организацию инвентаря, одна из причин, потому что хлама очень много.

1
Ответить

Используемые предметы однозначно будут. Стековость итемов нужна чтобы не создавать на более поздних этапах игры возможности накопить 100500 металлолома, который в системе с максимальным стеком займёт весь инвентарь и схрон в таком количестве. Иными словами чтобы игрок выбирал ценность лута для себя сам, а не просто пылесосил всё подряд.

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

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

Ответить