Использование покадровых анимаций в Unity3D
Наверняка вы заметили, что создав новую анимацию в Unity 5 сразу размещается ссылка на спрайт компонента SpriteRenderer. Unity так и зовёт выделить заготовленные кадры и перетащить их в окно Animation.
Пара движений мышкой и новая анимация украшает вашу игру. Но на 1 секунду ролика нужно 12 — 30 кадров. А если персонаж выполняет десяток различных движений: бегает, читает, сажает, поливает, играет, загорает, и т. д. то продолжительность всех анимаций переваливает за минуту, а кадров за тысячу. А персонаж не единственный анимированный объект на уровне. Вот мы и получили что не особо сложная сцена грузится дольше минуты, а Unity начинает слетать из-за перерасхода оперативной памяти. Да, конечно можно используя встроенный в Unity SpritePacker упаковать спрайты в атласы, но это даёт лишь незначительный результат и улучшение производительности на 10 — 20%.
Замена покадровых анимаций скелетными
Чтобы достичь более ощутимых результатов мы решили заменить покадровые анимации скелетными. Вместо прямоугольника на котором рисуется спрайт создаётся более сложная модель, на которой отрисовываются части персонажа из атласа.
Анимация получается за счет движений этой модели. Не пугайтесь, на самом деле всё просто! Есть несколько инструментов для создания скелетных 2d анимаций для юнити: Spine, DragonBones, Anima2D, Adobe Flash и др.
Т.к. наш художник делал все анимации во Flash для нас лучше всего подходил GAF.
Импорт анимаций из Flash в Unity3D
- Импортируем GAF из Unity AssetStore;
- Перетаскиваем файл *.swf в окно конвертора;
- Создаём объект и настраиваем его. Все настройки интуитивно понятны:
Анимации создаются автоматически, по разметке сделанной во Flash.
Для запуска нужных анимаций используем скриптинг:
using UnityEngine;
using GAF.Core;//Используем пространство имен GAF
public class Mouse : MonoBehaviour
{
//Объявляем и проставляем в инспекторе ссылку
[SerializeField] private GAFMovieClip GAFMovieClip;
void Update ()
{
if (Input.GetKeyDown(KeyCode.RightArrow))//При нажатии кнопки "вправо"
GAFMovieClip.setSequence("run", true);//Запускаем клип run циклично
}
}
Настройка переходов в Unity Animator
В Pro-версии GAF есть возможность использовать родной Unity-аниматор, что сделает разработку значительно проще. Однако нужно помнить что наш тип анимаций не поддерживает смешивание. Unity по умолчанию включает смешивание клипов. Так у нас анимации могут покорежиться на переходах между клипами. Чтобы анимации работали гладко отключаем смешивание клипов:
Редактирование анимационных клипов
Если окажется что во Flash вы не создали нужных клипов их можно собрать прямо в Unity, вызывая функцию updateToFrameAnimator() и указывая в качестве параметра нужный кадр.
Итоги:
Так заменив покадровые анимации на анимации созданные во Flash время загрузки сцен уменьшилось в 10 раз! Соответственно в разы сократился расход оперативной памяти.
Полезные ссылки:
Видеоурок «Использование Flash анимаций в Unity3D»
GAF: импорт Flash анимаций в Unity3d
Комментарии (18)
inborn_killer
21.02.2017 14:22Чтобы анимации работали гладко отключаем смешивание клипов
Разве одним из основных преимуществ «скелетной» (хотя в статье про скелет ни слова) анимации не является возможность бесшовных переходов мезду разными клипами? По-моему, вместо отключения смешивания стоит подкорректировать их так, чтобы они правильно смешивались.BoberUnity
21.02.2017 15:02В нашем случае смешивать не было надобности т.к. клипы начинались и заканчивались одинаковым кадром.
При смешивании Flash-анимаций как раз могут появляться артефакты т.к. создаваемая «промежуточная» модель не всегда выглядит правильно.inborn_killer
21.02.2017 17:11То есть анимация у вас не может прерваться не проигравшись до конца? Это значительно ухудшает отзывчивость управления (если, конечно, в вашей игре персонажи непосредственно реагируют на ввод пользлвателя).
BoberUnity
21.02.2017 18:15Да, у нас часто нужно дать клипу доиграться до конца. Возможно отзывчивость от этого и страдает. Нам важнее были симпатичные анимации. Покадровые анимации тоже не очень хорошо смешиваются.
saw_tooth
21.02.2017 14:32Если не сложно, сделайте сцену с 10-ю Вашими персонажами на скелетной и тайловой анимации и прикрепите лог профайлера, думаю там статья обретет краски.
Пользуясь случаем хочу спросить, как в юнити организовываются персонаж с различной анимацией, например верхней и нижней части (анимация ног и туловища), без блендинга.BoberUnity
21.02.2017 15:08Именно у нас от количества персонажей ничего не изменится. Хоть 1 хоть 10. При использовании покадровых анимаций использовалось более 1000 кадров, весом около 100 Мб. Вот сцена и грузилась дольше минуты. После конвертации Gaf-ом атлас и конфигурационные файлы весят 4 Мб. Сцена грузится 7 секунд.
KumoKairo
22.02.2017 12:42Я думаю в вопросе речь шла не столько о загрузке сцены, сколько о самом процессе анимации в плане выделения ресурсов процессора. То есть какие различия в производительности процесса анимации по сравнению с другими вариантами.
BoberUnity
21.02.2017 15:11Без блендинга можно разбить персонажа на 2 части и анимировать туловище отдельно от ног. Подойдёт для 2D игр. А так для каждой игры нужно подбирать подходящие и лучшие решения
Goodzonchik
21.02.2017 14:34Статья конечно интересная, но хотелось бы видеть какие-то данные замеров всего происходящего.
BoberUnity
21.02.2017 15:12Привёл выше.
При использовании покадровых анимаций время загрузки сцены 72 секунды, после конвертации анимаций 7 секунд.
AlVoReinDeer
22.02.2017 09:17+1Не знаю как остальным, но для меня плюс скелетной анимации над спрайтовой по потреблениям памяти казался более чем очевидным (N-ное количество текстур vs одна текстура и легковесные инструкции). Pro версией GAF не пользовался и на самом интересном месте статья не раскрывает где подкралась оптимизация. Например, почему не попробовали воспользоваться нативными Animation и сравнить не их с GAF?
BoberUnity
22.02.2017 09:24У нас значительно сократился расход оперативной памяти, что очевидно, когда мы избавляемся от тысячи кадров и заменяем их одной небольшой текстурой. Частоту кадров не замеряли т.к. с ней проблем не было. Сцена у нас несложная. Два персонажа и несколько анимированных объектов.
asknarin
22.02.2017 12:25к сожалению такой подход в корне меняет стилистику анимации. Грубо говоря сравните типичную анимацию дисней и южный парк, т.е. рисованую и апликационную. Хотя есть лучше пример — мультфильмы студии Киевнаучфильм — остров сокровищ, капитан Врунгель и Айболит — там вобще в монтаже могут клеится эпизоды выполненные покадровой анимацией и перекладки. И хотя персонажи одни и те же, но это выглядит как будто внезапно начинается полностью другой мультфильм.
Поэтому если стилистика позволяет свичнуться на перекладки — ну ок, тем более это ещё и сильно сниждает затратность производства непосредственно самой анимации.
Но я вот, собственно, столкнулся с этим в своей игре — для меня важно чтобы анимация была именно в такой стилистике которая возможна только при покадровой анимации (чтото среднее между типичным диснеевским стилем и адвенчур тайм/губка боб). Естественно вылезла куча проблем с переходами и т.д. Очевидно что это тяжелее. И вот было бы интересно почитать про оптимизацию такого подхода.BoberUnity
22.02.2017 12:33Конечно в каждой игре своя специфика и нужно подбирать софт под свои задачи.
В статье описано использование в юнити анимаций созданных во Flash. И в вашем случае это вопрос к художникам — в каком софте они будут создавать раскадровку. Не рисовать же от руки как в Киевнаучфильме. Возможно именно для того редактора анимаций уже есть подобный ассет.
LLlAMuJIb
23.02.2017 09:42А чем вам не понравился базовый функционал скелетной анимации unity? Берете тот же атлас, соединяете части в один объект и в аниматоре пользуете translation и прочие прелести. Есть неплохой видос с unite 2014, как это делается без лишних движений.
BoberUnity
25.02.2017 13:09У нас анимации уже были сделаны во флеше. Flash это профессиональный инструмент в котором можно создавать более качественные анимации. Художников-аниматоров работающих во флеш тоже гораздо больше чем желающих изучать юнити.
AzureSeraphim
А ты отважный, раз в шапку больше половины статьи запихал!