Спайн-анимация для плееблов.

early access

текст не вычитан, ознакамливайтесь с ним на свой страх и риск

Подготовка спайн-анимации для плееблов имеет ряд отличий от подготовки спайн-анимаций для любых других проектов. Нужно руководствоваться двумя принципами: лёгковесность анимаций и маленький атлас.

Основные тезисы

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

В эти 5 мбайт билда должны вмещаться код, вся статика (ui, фоны, пропсы, эффекты), звук с музыкой, и, наконец, спайн анимации.

На выходе у аниматора есть 1-2 мбайта веса. Не особо разгуляешься, но с этим можно работать.

Второй важный момент - сами анимации должны быть максимально лёгкими: аниматор должен максимально ограничить себя в использовании фичей вроде мешей и констрейнов.

Почему так? Эти анимации проигрываются в игре в собственном движке или браузере. Игра в игре, подтянутая извне. Такие игры должны проигрываться одинаково хорошо на всём спектре устройств: от допотопных калькуляторов и чайников, до стиральных машин с утюгами. Это условие тяжело поддерживать, если у нас будет костей чуть больше 50, в меше будет вертексов чуть больше четырёх, весов на вертекс больше двух, и тд. Об этом чуть ниже.

Пример метрики одного из легковесных персонажей, у которого оставался простор для оптимизации:

Весе и организация скелета

Вес экспорта зависит от двух вещей: размер атласа и вес анимации в json.

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

Есть простое правило: руки состоят из трёх костей: плеча(hand), предплечья (arm), кисти(palm) (названия в скобках условное), ноги состоят тоже из трёх частей: бедро (hip/leg), голень(shin), стопа(boot). Тело из одной-двух костей, шею по возможности смёржить с телом, голова отдельно.

Зрачки и части лица вроде бровей лучше мёржить вместе, и делорганизовать эмоции списком аттачментов к слоту. Если есть необходимость в анимации волос-тканей, не больше 1-3 костей на сущность.

Обычный скелет персонажа из HC:

Сохраните себе нервы - сделайте кость под рутом, назвав её container, scale или main - на скрине выше есть и Container и Main. Это обусловлено тем, что арт персонажей часто присылается в размере x2, x1.5, x3 и аниматор вынужден на своей стороне скейлить скелет до нужного в игре размера. Кость root нельзя трогать вообще ни в каких анимациях (ни вращать, ни скейлить), поэтому для скейла скелета в нужный размер, используется кость вроде Container, Main или с любым другим названием.

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

Нейминг, регламент и скина

Короткие названия из трёх-четырёх букв работают лучше на длинной дистанции разработки, когда надо быстро ориентироваться в куче скелетов и иметь свой собственный общий регламент. К делу не сильно относится, но работающей практикой является переименование частей тела с одной стороны и другой по регламенту: всё, что слева от зрителя это Left, всё, что справа - Right, на момент рига. Таким образом левая рука будет названа HandLeft, ArmLeft, PalmLeft, а правая от зрителя рука HandRight, ArmRight, PalmRight и так далее.

Иногда разработчики просят переменовывать кости в соответствии с их внутренними правилами, дашбоардами и регламентами. Например, использовать только строчные буквы, а части слов в нейминге разделять дефисом: ArmLeft становится arm-left. Это легко изменить с помощью инструмента поиска в спайне.

При необходимости использовать IK перед названием кости, можно прописать префикс IK_, в этом случае BootLeft, на которую будет завязана кинематика ноги (HipLeft > ShinLeft) будет иметь название IK_BootLeft.

В примере я использовал 4 IK кости, две для стоп, две для кистей. Обычно, можно оставлять только стопы, но здесь было много анимаций с оружием и предметом, и нужен был чуть больший контроль в движении, чем обычно. Лучше избежать большого количества IK.

В проектах часто приходится делать много скинов, поэтому работа сопряжена с частым переименованием аттачментов-спрайтов-изображений в нужный формат. Есть лёгкое решение: в графическом редакторе добавить базовому скину постфикс _base, _hero или _main, а всем остальным другие постфиксы: рыцарю, например _knight. В этом случае, заригав один скин, мы сдублируем его и в поиске просто переименуем _hero в _knight, и всё сработает. Местами иногда требуется поднастроить-подвигать спрайты в спайне.

Причина такого решения: разработчики плееблов работают в разных движках: construct3, pixiJS, Phaser, Cocos, Unity, TreeJS, Defold, и многих других. Каждый движок имеет разные поддержки рантайма спайн: кто-то ест последнюю свежую стабильную версию спайна, кто-то застрял на древней 3.6. Какие-то движки хорошо используют пути к скинам в папках /skin/handright.png, какие-то нет.

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

Пример организации такого варианта.

Оптимизация анимации и мешей.

Аниматор плееблов это больше технический аниматор, чем аниматор творческий. Чем меньше ключей, тем лучше, чем меньше костей, тем лучше, чем меньше мешей, тем лучше.

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

При экспорте анимации в json нельзя забывать о чекбоксе animation clean up.

Анимация Idle может быть подкручена тремя костями, например.

Аниматор плееблов это не про rich-анимацию, это про техничность испольнения, урезание своего творческого позыва сделать красиво и про сильные рамки и ограничения.

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

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

В каждом из этих случаев стоит руководствоваться принципом на кость не больше четырёх вертексов. Если кости две у меша, то вертексов 6, если кости три, то 8 вертексов. Этого правила стоит придерживаться, но именно в мешах и работе с ними часто приходится от него отказываться или модифицировать его.

Пример юбки, которая должна активно растягиваться при беге. Обычный спрайт на четыре вертекса. Основной является кость Skirt, две других - ноги, имеют влияение в весах только на нижние точки меша, и то не полностью. Настраивается это индвидуально. Но правила - не более двух весов на вертекс стоит придерживаться максимально: от этого сильно зависит вычислительная оптимизация анимаций.

Пример второй, юбка больше, костей больше, персонаж должен ходить. 7 вертексов на 4 кости. На каждый вертекс не больше двух весов.

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

Оптимизация арта.

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

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

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

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

Это всё снижает вес атласа - главную область оптимизации занимаемого веса экспортируемой анимации.

В процессе экспорта анимации надо постараться использовать скейл равный или меньший скейлу кости, сделанной под рутом. Если там скейл 0.5, то сделать экспорт 0.5~0.4 или даже до 0.3, если качество позволит.

Нужный скейл анимации может подсказать разработчик, который сообщит, скейлил ли он тестовый экспорт, и в какую сторону. В зависимости от этого, мы выбираем нужный нам скейл кости Container/Scale/Main, и выставляем похожий или меньший скейл в настройках экспорта.

Итоговый атлас должен быть меньше 1024х1024, в идеале меньше 512х512, ещё лучше, если будет 256х256, но тут зависит от количества скинов. В настройке указать чекбокс Power of Two.

Спасибо, что прочли. Есть вопросы? Пишите