King, Witch and Dragon. Отчёт 2

Как и обещал, выкладываю наработки по процедурной анимации второй способности главного героя.

Описание фичи

В моей игре персонаж имеет способность "бросок гадюки". По сути это рывок на короткую дистанцию, во время которого персонаж принимает форму змеи.

Концепт арт сделанный несколько месяцев назад, на старте проекта​
Концепт арт сделанный несколько месяцев назад, на старте проекта​

На открытой местности персонаж может делать рывок в 8 направлениях: вверх, вниз, влево, вправо и по диагоналям.

Интересное начинается, когда персонаж пытается сделать рывок в узкий проход или тоннель. Персонаж будет оставаться в форме гадюки и продолжать двигаться по тоннелю, пока не выйдет на открыте пространство, на котором снова сможет принять человеческое обличие. Тоннели при этом могут изгибаться и иметь интересные формы.

Задача состояла в том, чтобы длинный хвост змеи корректно вёл себя в тоннелях и повторял траекторию движения головы.

Комбинированная анимация

Если для предыдущей способности с паучьими лапами вся анимация создавалась полностью процедурно в движке, то для этого случая я решил использовать комбинированный подход, при котором анимация частично создаётся в Blender'е и частично в движке. В этом случае волнообразное или спиралевидное движение хвоста создается в Blender'е, а затем весь этот волнообразный хвост изгибается по траектории движения змеи уже в движке.

Риг и Анимация

Для начала я создал "ползучую" анимацию в Blender'е. Забегая вперед скажу, что для такого комбинированного подхода пришлось сделать 2 набора костей в хвосте. Один набор костей для волнообразного движения. На эти кости заскинен меш змеи. Второй набор костей нужен чтобы манипулировать ими в движке. При этом каждая отдельня кость первого набора является child'ом соответствующей кости второго набора и анимируется отностельно неё.

Анимация выглядит так:

Да, я знаю, что змеи так не ползают :) Но так как в игре камера сбоку, такая анимация лучше читается (при этом она хорошо читается со всех ракурсов, хоть сверху, хоть сбоку, хоть спереди). И по факту при рывке змея не ползёт, а летит.

После интеграции её в игру получился вот такой простой рывок (пока что без FX'ов и анимаций перехода из одного состояния в другое):

Процедурная анимация

Первой идеей было сделать в лоб и повесить на каждую кость сферический коллайдер, соединить их hinge joint'ами и пускай себе болтаются в тоннеле. Но эту идею я очень быстро отмёл.

Во-первых у меня в игре очень мало "честной" физики. Контроллер персонажа полностью кинематик и использует физ-движок только для нахождения коллизий вокруг себя с помощью всякого рода RayCast'ов и CapsuleCast'ов. Да и вообще недетерминированная физика в Unity меня неочень радует.

Второй мыслью было сделать анимацию по пути (along path). Но тогда каждый тоннель пришлось бы настраивать вручную и дополнительно прокладывать в нём путь, по которому бы двигалась змея. Я же хотел сделать более универсальное решение, которое не требовало бы дополнительной настройки со стороны левел-дизайна.

По этому пришлось писать свою реализацию поведения хвоста змеи.

Прототип на плоскости

Для того чтобы потестировать и поиграться с поведением хвоста я написал простенький скрипт, в котором задаётся массив элементов, которые будут сегментами хвоста. Первый элемент является "головой" и задаёт траекторию движения всех остальных элементов. При этом можно менять линейную скорость движения, угловую скорость поворота и расстояние между сегментами.

Выглядело это вот так:

В принципе всё работало так, как я и ожидал. У меня не было цели сделать "ultimate snake controller" и я решил остановиться на текущей реализации, не смотря на то, что у неё были свои ограничения и недостатки, но меня они устраивали.

Собственно, скрипт контроллера змеи тут, если кому интересно.

Испытания на реальной змее

Недолго думая, я решил повесить этот скрипт на модель змеи и посмотреть как оно работает. Для начала протестировал просто деформацию скелета, без спиралевидной анимации.

А потом и с анимацией:

Адаптация под 8 направлений

После этого мне пришлось немного доработать скрипт, чтобы голова смотрела в нужную сторону при движении в 8 направлениях, а также, чтобы змея не перекручивалась при поворотах в тоннеле.

Финальный вариант выглядит так:

Что дальше?

На этом со змеёй пока что всё. Теперь буду делать крюк-кошку в виде щупальца. Для неё планирую делать не только процедурную анимацию, но и процедурную генерацию меша в реальном времени.

Интересно? Тогда подписывайтесь на меня в Instagram и Twitter, а также вступайте в группу VK, в которой я публикую апдейты и материалы по проекту до того как они попадают сюда.

Спасибо за внимание!

2626
2 комментария

Что паучья, что вот эта способность - выглядит завораживающе круто!)

1
Ответить

Спасибо! 

Ответить