Перетаскивание предметов в инвентаре 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 упрощает процесс. Необходима доработка алгоритма размещения предметов и добавление анимации.