Pull to refresh

Оптимизация анимаций в Unity3D

Reading time 2 min
Views 22K

Использование покадровых анимаций в Unity3D


Наверняка вы заметили, что создав новую анимацию в Unity 5 сразу размещается ссылка на спрайт компонента SpriteRenderer. Unity так и зовёт выделить заготовленные кадры и перетащить их в окно Animation.



Пара движений мышкой и новая анимация украшает вашу игру. Но на 1 секунду ролика нужно 12 — 30 кадров. А если персонаж выполняет десяток различных движений: бегает, читает, сажает, поливает, играет, загорает, и т. д. то продолжительность всех анимаций переваливает за минуту, а кадров за тысячу. А персонаж не единственный анимированный объект на уровне. Вот мы и получили что не особо сложная сцена грузится дольше минуты, а Unity начинает слетать из-за перерасхода оперативной памяти. Да, конечно можно используя встроенный в Unity SpritePacker упаковать спрайты в атласы, но это даёт лишь незначительный результат и улучшение производительности на 10 — 20%.



Замена покадровых анимаций скелетными


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



Анимация получается за счет движений этой модели. Не пугайтесь, на самом деле всё просто! Есть несколько инструментов для создания скелетных 2d анимаций для юнити: Spine, DragonBones, Anima2D, Adobe Flash и др.
Т.к. наш художник делал все анимации во Flash для нас лучше всего подходил GAF.

Импорт анимаций из Flash в Unity3D


  1. Импортируем GAF из Unity AssetStore;
  2. Перетаскиваем файл *.swf в окно конвертора;
  3. Создаём объект и настраиваем его. Все настройки интуитивно понятны:



Анимации создаются автоматически, по разметке сделанной во 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
Tags:
Hubs:
+11
Comments 18
Comments Comments 18

Articles