King, Witch and Dragon. Отчёт 3
Начал работу над третей процедурной способностью персонажа - щупальце, которое используется в качестве крюка-кошки.
Эта способность более сложная с точки зрения технической реализации и требует больше времени, по этому я решил поделиться промежуточными результатами.
Описание фичи
В игре персонаж может использовать крюк-кошку, чтобы цепляться за стены и попадать в сложнодоступные места. Также, им можно притягивать к себе врагов. Вот только вместо крюка на верёвке персонаж вытягивает длинное щупальце, которое присосками цепляется за врагов и поверхности (ведь способность он получил от Ведьмы, по этому визуально надо соответствовать).
Процедурная генерация всего
В момент активации способности игра начинает в реальном времени
- генерировать модель щупальца с присосками
- назначать UV-координаты точкам
- накладвать материал с текстурой
- рассчитывать нормали поверхности
- изгибать, скручивать и смещать щупальце в соотвествии с заданными параметрами
Ручное прописывание массивов точек, UV-координат, треугольников и прочего, даже с использованием циклов, то ещё удовольствие. Но если вам всё таки интересно глубже изучить тему процедурной генерации моделей в Unity, я рекомендую почитать статью на Catlike Coding и посмотреть серию видео на канале Board To Bits
Что получилось?
Для начала, я сделал щупальце, которое принимает базовый список параметров и применяет их ко всей модели:
На gif-ке показано изменение в реальном времени толщины щупальца, скручивания и отступа от центральной оси. Помимо этого можно задавать размер присосок, их количество и расстояние между ними.
Даже так щупальце уже выглядит приемлимо, но я решил на этом не останавливаться.
Если присмотреться к концепту выше, то можно заметить, что щупальце вначале несколькими витками скользит и "наматывается" на руку главного героя, а затем уже более широкими витками извивается в воздухе. Такого эффект нельзя добиться при равномерном (линейном) распределении параметров, по этому я сделал так, что каждый параметр можно контролировать с помощью Animation Curve (в данном случае не имеет ничего общего с анимацией и используется для задания нелинейного распределения).
С помощью этого инструмента можно, например:
- сделать, чтобы щупальце делало широкие, размашистые витки в середине траектории и почти не отклонялось от оси в конце и в начале (прилегало к руке)
- сделать больше витков в начале пути, на руке персонажа и меньше к концу траектории
- сделать щупальце постоянной толщины и сужать только у самого кончика
- сделать различные профили для движения вперёд (волнообразное вытягивание щупальца к цели), для притягивания персонажа к стене (натянутое щупальце, без смещения от оси) и для втягивания щупальца, если оно не дотянулось до стены или врага (тоже волнообразное, но другой формы).
Вот так щупальце выглядит, относительно статичного персонажа:
Что дальше?
Теперь нужно "подружить" щупальце с контроллером персонажа и с другими способностями, чтобы можно было перемещаться по уровню, комбинируя двойной прыжок, хождение по стенам, рывок и крюк-кошку.
Спасибо за внимание!