Как и обещал, выкладываю наработки по процедурной анимации второй способности главного героя.Описание фичиВ моей игре персонаж имеет способность "бросок гадюки". По сути это рывок на короткую дистанцию, во время которого персонаж принимает форму змеи.Концепт арт сделанный несколько месяцев назад, на старте проектаНа открытой местности персонаж может делать рывок в 8 направлениях: вверх, вниз, влево, вправо и по диагоналям. Интересное начинается, когда персонаж пытается сделать рывок в узкий проход или тоннель. Персонаж будет оставаться в форме гадюки и продолжать двигаться по тоннелю, пока не выйдет на открыте пространство, на котором снова сможет принять человеческое обличие. Тоннели при этом могут изгибаться и иметь интересные формы. Задача состояла в том, чтобы длинный хвост змеи корректно вёл себя в тоннелях и повторял траекторию движения головы.Комбинированная анимацияЕсли для предыдущей способности с паучьими лапами вся анимация создавалась полностью процедурно в движке, то для этого случая я решил использовать комбинированный подход, при котором анимация частично создаётся в Blender'е и частично в движке. В этом случае волнообразное или спиралевидное движение хвоста создается в Blender'е, а затем весь этот волнообразный хвост изгибается по траектории движения змеи уже в движке.Риг и АнимацияДля начала я создал "ползучую" анимацию в Blender'е. Забегая вперед скажу, что для такого комбинированного подхода пришлось сделать 2 набора костей в хвосте. Один набор костей для волнообразного движения. На эти кости заскинен меш змеи. Второй набор костей нужен чтобы манипулировать ими в движке. При этом каждая отдельня кость первого набора является child'ом соответствующей кости второго набора и анимируется отностельно неё.Анимация выглядит так:Да, я знаю, что змеи так не ползают :) Но так как в игре камера сбоку, такая анимация лучше читается (при этом она хорошо читается со всех ракурсов, хоть сверху, хоть сбоку, хоть спереди). И по факту при рывке змея не ползёт, а летит.После интеграции её в игру получился вот такой простой рывок (пока что без FX'ов и анимаций перехода из одного состояния в другое):Процедурная анимацияПервой идеей было сделать в лоб и повесить на каждую кость сферический коллайдер, соединить их hinge joint'ами и пускай себе болтаются в тоннеле. Но эту идею я очень быстро отмёл. Во-первых у меня в игре очень мало "честной" физики. Контроллер персонажа полностью кинематик и использует физ-движок только для нахождения коллизий вокруг себя с помощью всякого рода RayCast'ов и CapsuleCast'ов. Да и вообще недетерминированная физика в Unity меня неочень радует. Второй мыслью было сделать анимацию по пути (along path). Но тогда каждый тоннель пришлось бы настраивать вручную и дополнительно прокладывать в нём путь, по которому бы двигалась змея. Я же хотел сделать более универсальное решение, которое не требовало бы дополнительной настройки со стороны левел-дизайна.По этому пришлось писать свою реализацию поведения хвоста змеи.Прототип на плоскостиДля того чтобы потестировать и поиграться с поведением хвоста я написал простенький скрипт, в котором задаётся массив элементов, которые будут сегментами хвоста. Первый элемент является "головой" и задаёт траекторию движения всех остальных элементов. При этом можно менять линейную скорость движения, угловую скорость поворота и расстояние между сегментами.Выглядело это вот так:В принципе всё работало так, как я и ожидал. У меня не было цели сделать "ultimate snake controller" и я решил остановиться на текущей реализации, не смотря на то, что у неё были свои ограничения и недостатки, но меня они устраивали.Собственно, скрипт контроллера змеи тут, если кому интересно.Испытания на реальной змееНедолго думая, я решил повесить этот скрипт на модель змеи и посмотреть как оно работает. Для начала протестировал просто деформацию скелета, без спиралевидной анимации.А потом и с анимацией:Адаптация под 8 направленийПосле этого мне пришлось немного доработать скрипт, чтобы голова смотрела в нужную сторону при движении в 8 направлениях, а также, чтобы змея не перекручивалась при поворотах в тоннеле. Финальный вариант выглядит так:Что дальше?На этом со змеёй пока что всё. Теперь буду делать крюк-кошку в виде щупальца. Для неё планирую делать не только процедурную анимацию, но и процедурную генерацию меша в реальном времени.Интересно? Тогда подписывайтесь на меня в Instagram и Twitter, а также вступайте в группу VK, в которой я публикую апдейты и материалы по проекту до того как они попадают сюда.Спасибо за внимание!
Что паучья, что вот эта способность - выглядит завораживающе круто!)
Спасибо!