Все заметки

Группировка анимаций

Решил значит я сделать так, чтобы персонаж поворачивался в сторону, куда он наносит удар. Сейчас то, куда он смотрит зависит от того, куда он бежит или бежал. Поэтому в игре про петухов можно было заметить, что иногда лазерные лучи вылетали у игроков откуда-то из задницы. Если при стрельбе это просто смущает, то при ударе мечом становится вовсе не очевидным куда был нанесен удар. Туда куда кликнул игрок мышкой? Или туда куда персонаж взмахнул мечом? Непонятно.

Чтобы исправить это недоразумение, достаточно помимо вектора движения добавить вектор направления взгляда. Его можно менять при движении или же при атаке. Все просто. Плюс, почему бы тогда заодно не дорисовать еще несколько кадров в анимации, чтобы стало видно когда персонажи смотрят вверх или вниз? Снова ничего сложного.

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

Файлы с анимациями для каждого персонажа уже сейчас достигают размеров в 500-600 строчек кода. Их было больно составлять еще во время людума. С учетом доработок появится еще как минимум по шесть новых состояний (смотрит вверх, атакует вниз и тд.). И между всеми этими состояниями возможен переход. Если попытаться нарисовать граф, в котором будут отражены все состояния и возможные переходы, то довольно скоро обнаружишь, что ты устал и тебе хочется бросить это глупое занятие. А ведь все это еще нужно будет перенести в JSON. Сколько там строк будет? Одна тысяча? Две? Или еще больше?

Старая схема состояний анимаций

С этим определенно нужно что-то сделать.

В Unity есть инструмент, который называется деревом смешивания анимаций (blend tree). Он используются в трехмерных играх когда, к примеру, нужно сделать плавный переход между бегом и ходьбой. Анимации бега и ходьбы объединяются в одно единое состояние-дерево. У каждой такой анимации устанавливается характерный для нее показатель скорости, а фактическая скорость будет указывать на то, в каких пропорциях следует эти анимации смешать.

Многие наверняка могли заметить в какой-нибудь трехмерной игре, когда при управлении персонажем с геймпада, отклоняя стик, ты заставляешь персонажа сначала идти пешком, а затем плавно переходить на бег.

Этот инструмент активно используется и в 2D играх для группировки схожих по своей природе анимаций в одно состояние. К примеру, анимации бега во всевозможных направлениях, можно запаковать в такое вот дерево. Вместо смешивания будет выбираться одна ближайшая анимация по определенно установленным параметрам. В моем случае, в зависимости от x и y координат вектора взгляда.

Выглядит как то, что нужно. Граф станет намного проще.

Новая схема состояний анимаций с группами

Группировка однотипных анимаций в одно состояние это, конечно, хорошо, но как бы то ни было все еще остается необходимость составлять граф в JSON-е и это довольно утомительное занятие. К тому же вероятность ошибки довольно высокая. Длинные полотна конфигов тяжело анализировать, поэтому можно легко что-то упустить по невнимательности.

Напрашивается какой-то визуальный инструмент, где можно добавлять и редактировать состояния и переходы между ними. Можно начать с чего-нибудь простого. Чтобы можно было охватить взглядом все доступные состояния, все имеющиеся переходы из одного в другое. Чтобы не надо было постоянно скроллить полотна текста в поисках нужного участка.

В результате я собрал на React-е достаточно простой редактор, где каждой сущности вроде кадров, состояний и переходов отведена своя секция на экране. По клику на сущность, справа открывается инспектор в котором ее можно детально посмотреть и отредактировать. Без каких-либо украшений вроде красивых кнопок, material-инпутов, теней и прочего. Анимацию можно создать с нуля и выгрузить JSON в виде файла или же загрузить существующий, отредактировать его и затем выгрузить обратно. Все работает локально без бэкенда.

Потребуется еще какое-то время чтобы оценить, насколько удобнее стало настраивать анимации в игре, но результат уже чувствуется. Все необходимые изменения я смог сделать за 20 минут. И то, потому что где-то в середине процесса в квартире вырубили электричество и я потерял весь прогресс. После этого я начал постоянно жать на кнопку экспорта чтобы выгружать промежуточный результат.

Еще бы редактор чтобы уровни рисовать и будет совсем хорошо.