Создание анимаций пользовательского интерфейса игр

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

От иммерсивных приложений до игровых миров и 3D-сцен

Наша выделенная команда для VR/AR/MR-разработки, Unity-продакшна и 3D-моделирования и анимации с собственными кейсами и презентациями.

Посетить персонализированный сайт
Показано 1 из 1 услугВсе 242 услуг
Создание анимаций пользовательского интерфейса игр
Средняя
~3 рабочих дня
Часто задаваемые вопросы
Наши компетенции
Какие этапы разработки игры?
Последние работы
  • image_games_mortal_motors_495_0.webp
    Разработка игры для компании Mortal Motors
    671
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Пошаговая стратегия в фэнтези сеттинге With Fire And Sword
    860
  • image_games_second_team_604_0.webp
    Разработка игры для компании Second term
    490
  • image_games_phoenix_ii_606_0.webp
    3D-анимация — тизер для игры phoenix 2.
    533

Создание анимаций пользовательского интерфейса игр

Анимация UI — это не украшение. Это сигнальная система: открытие экрана, подтверждение действия, получение награды, предупреждение об ошибке. Правильная анимация сокращает когнитивную нагрузку — игрок понимает, что произошло, без чтения текста. Неправильная анимация бесит: слишком медленная задерживает игровой процесс, слишком резкая пропускается незаметно.

Инструменты анимации UI в Unity: три подхода

Animator + Animation Clips — классика. Работает через Animator Controller на Canvas-объекте. Плюс: видимость в Unity Animator, поддержка Blend Trees, легко управлять через SetTrigger/SetBool. Минус: тяжело управлять динамически (если нужно анимировать элемент в произвольную позицию, известную только во время игры — Animator не поможет напрямую). Подходит для фиксированных переходов: открытие/закрытие экрана, pulse-эффект на кнопке, idle-анимация элемента.

DOTween — де-факто стандарт для code-driven UI анимаций в Unity. RectTransform.DOAnchorPos(), CanvasGroup.DOFade(), Image.DOColor() — всё это через fluent API с возможностью sequencing. DOTween.Sequence() с .Append(), .Join(), .InsertCallback() позволяет строить сложные скоординированные анимации из кода без визуального редактора. Важный момент: DOTween работает в Update-цикле, что означает — при Time.timeScale = 0 (пауза игры) анимации UI останавливаются тоже, если не использовать SetUpdate(UpdateType.Normal, true) для ignoreTimeScale.

UI Toolkit Transitions — CSS-подобные transitions через USS: transition-property: translate; transition-duration: 300ms; transition-timing-function: ease-out;. Самый декларативный подход, но с ограниченными возможностями по сравнению с DOTween — только трансформации, непрозрачность и цвет. Хорошо работает для hover-эффектов и простых переходов состояний.

Timing и easing: физика анимации UI

Диапазоны длительности, которые работают:

  • Микро-обратная связь (hover, press): 80–120 мс
  • Появление/скрытие малого элемента (tooltip, badge): 150–200 мс
  • Переход экрана (открытие инвентаря, меню): 250–350 мс
  • Награды и fanfare-анимации: 600–1200 мс

Всё, что больше 400 мс для утилитарных переходов — раздражает при повторных открытиях. Игрок открывает инвентарь сто раз за сессию. 600 мс перехода = минута потраченного времени только на ожидание открытия.

Easing функции не симметричны по назначению. Ease Out (fast start, slow end) — для появляющихся элементов: элемент вылетает быстро и мягко останавливается на месте, создавая ощущение «приземления». Ease In (slow start, fast end) — для исчезающих: элемент медленно начинает и быстро улетает. Ease In/Out — для переходов между состояниями, где нет чёткого «откуда» и «куда». Linear easing в UI почти никогда не нужен — выглядит механически.

Overshoot и spring: когда физика работает

Overshoot (анимация, которая немного переходит за целевое значение и возвращается) добавляет «веса» и «характера» элементу. DOTween предоставляет Ease.OutBack и Ease.OutElastic. OutBack с strength 1.5–2.0 хорошо работает для pop-up уведомлений: элемент «выпрыгивает» немного за пределы финального размера и возвращается. OutElastic — для игровых наград, лут-боксов, критических попаданий, где нужна энергичная реакция.

Важное ограничение: overshoot анимации на больших экранных элементах (full-screen панели) выглядят странно. Это работает только для компактных элементов — иконок, кнопок, pop-up уведомлений.

Кейс: уведомление о получении предмета

На проекте потребовалась анимация всплывающего уведомления при получении предмета: иконка + название + описание. Анимация должна была появляться без остановки геймплея, удерживаться 2 секунды и исчезать.

Реализация через DOTween Sequence: иконка вылетает снизу с Ease.OutBack за 200 мс, одновременно (.Join()) фейд CanvasGroup.alpha с 0 до 1. Через 200 мс текст появляется через DOFade за 150 мс (.AppendInterval(0.2f).Append(...)). Удержание — .AppendInterval(2f). Исчезновение: сдвиг вправо + фейд за 200 мс с Ease.InCubic. Вся последовательность — 15 строк кода, переиспользуется через NotificationController.Show(item).

Проблема, которую решали отдельно: при быстром получении нескольких предметов подряд новое уведомление должно было вытеснять старое, а не накапливаться в очередь. Решение: при вызове Show() проверяем, есть ли активный tween, убиваем его через DOTween.Kill(targetTransform) и запускаем новую анимацию.

Производительность UI-анимаций: где терять FPS незаметно

Анимации в Canvas часто вызывают Canvas Rebuild — пересчёт всей UI-геометрии. Это происходит каждый раз, когда меняется что-то в иерархии Canvas: позиция, размер, непрозрачность через alpha. CanvasGroup.alpha не вызывает Rebuild геометрии (только перерасчёт прозрачности), а вот изменение RectTransform.position через DOTween — вызывает.

Для анимаций перемещения это означает: анимировать через DOAnchorPos (изменение AnchoredPosition) безопаснее, чем через DOMove (изменение World Position). AnchoredPosition работает в локальном пространстве Canvas и вызывает Rebuild только для изменённого элемента и его родителей, World Position может потянуть за собой пересчёт всей иерархии.

Для scale-анимаций: transform.DOScale() на дочернем объекте Canvas не вызывает Canvas Rebuild вообще — масштаб обрабатывается на уровне Transform, а не Layout системы. Это самый дешёвый тип UI-анимации. Именно поэтому pulse-эффект (лёгкое увеличение/уменьшение масштаба) так популярен для кнопок с call-to-action.

Разбивайте анимируемые элементы на отдельные Canvas'ы. Если иконка в углу экрана мигает для привлечения внимания — она должна быть в своём Canvas, чтобы её Rebuild не перестраивал геометрию всего HUD каждый кадр.

Анимация состояний кнопок: нюансы

Стандартный Button в uGUI с ColorTween анимирует Highlight/Pressed/Disabled состояния через Color. Это работает, но ограничено. Для кастомного поведения лучше использовать UIAnimation компонент на основе DOTween или переопределить IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler.

Scale-анимация на кнопке при нажатии (Press: scale 0.95, Release: scale 1.0) — один из самых простых и эффективных тактильных откликов. 80 мс с Ease.OutQuad. Для мобильных платформ это особенно важно, потому что тактильной вибрации под пальцем нет, а визуальная обратная связь критична.

Тип работы Сроки
Анимации одного экрана (5–10 переходов) 2–5 дней
Полная анимация UI-комплекта (10–15 экранов) 2–5 недель
Сложные fanfare-анимации (наград, уровней) 1–2 недели
Анимационная система с управлением из кода 1–3 недели

Стоимость определяется индивидуально после анализа требований к анимациям.