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