Перенос предметов в Unity: инвентарь и Drag&Drop

Перетаскивание предметов в инвентаре 2D PixelArt RPG, создаваемой в Unity, реализовано с использованием интерфейсов IDragHandler и IDropHandler. Система инвентаря была переработана для улучшения визуального отображения предметов.

Реализация перетаскивания

Перетаскивание предметов, отображаемых в GridLayout, реализовано с помощью интерфейсов IDragHandler и IDropHandler Unity. Эти интерфейсы предоставляют методы:

  • OnBeginDrag: При начале перетаскивания родительский объект перетаскиваемого предмета отсоединяется от GridLayout (transform.parent), позволяя свободно перемещать предмет по экрану.
  • OnDrag: Во время перетаскивания позиция предмета синхронизируется с положением курсора мыши.
  • OnEndDrag: По окончании перетаскивания осуществляется поиск ближайшей свободной ячейки в GridLayout. Предмет помещается в ячейку с найденным индексом с помощью SetSiblingIndex. Поиск ведется по иерархии дочерних объектов GridLayout. При отсутствии свободной ячейки предмет остается на месте.

Алгоритм поиска ячейки

Сортировка предметов в GridLayout осуществляется по иерархии. Перемещение объекта в иерархии одновременно перемещает его визуально. Алгоритм находит ближайший дочерний объект к месту отпускания предмета и определяет его индекс. Затем предмет помещается в соответствующую ячейку. Отсутствие обработки ситуации с отсутствием свободных ячеек является недостатком, требующим доработки.

Метод Init

Метод Init, принимающий объект GridLayoutGroup, используется для инициализации параметров, связанных с перетаскиванием. Он расположен в Start(), где также происходит рендеринг. Причины такого решения требуют дальнейшего обсуждения.

Будущие доработки

Планируется реализовать выброс предмета из инвентаря и визуальное представление предмета в игровой сцене.

Реализовано простое, но функциональное перетаскивание предметов в инвентаре Unity. Использование IDragHandler и IDropHandler упрощает процесс. Необходима доработка алгоритма размещения предметов и добавление анимации.

Что будем искать? Например,программа