Unity3D Значительно Ускорить Рендеринг 2D-Анимации? Легко

В этой статье я хотел бы рассказать о том, как был ускорен рендеринг монстров при создании игры Alien Massacre. Это решение подойдет для любых проектов, использующих спрайтовую анимацию.

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

В результате были сформированы следующие требования:

  • 1 Необходимо обеспечить отрисовку большого количества анимированных объектов на сцене.

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

  • 2 Ход анимации должен быть разным для каждого из объектов.

    В конце концов, мы не хотим, чтобы мобы маршировали строем.

Готовое решение Конечно, первое решение было простым: делать всё, используя уже встроенный в UnityEngine компонент Animator. Посмотрим, что из этого получится.

В качестве атласа с оригинальной анимацией мы будем использовать злого монстра с 24 кадрами спрайтовой анимации по 64х64 пикселей каждый:

Unity3D Значительно ускорить рендеринг 2D-анимации? Легко

В Unity3D мы установили тип текстуры спрайт, а в SpriteEditor разрезали ее на 24 части.

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

Без проблем! Минута работы и сценарий готов.

АнимацияОфсет.cs

  
   

using UnityEngine; namespace Kalita { [RequireComponent(typeof(Animator))] public class AnimationOffset : MonoBehaviour { public int Offset; public bool IsRandomOffset; private void Start() { var animator = GetComponent<Animator>(); var runtimeController = animator.runtimeAnimatorController; var clip = runtimeController.animationClips[0]; if (IsRandomOffset) Offset = Random.Range(0, (int) (clip.length*clip.frameRate)); var time = (Offset*clip.length/clip.frameRate); animator.Update(time); } } }

Теперь собираем все это вместе и получаем решение, которое предоставляет Unity3D «из коробки».



Unity3D Значительно ускорить рендеринг 2D-анимации? Легко

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

Все, кто работает в Unity3D, давно привыкли к настройке аниматоров.

Но что, если вашему приложению требуется большая производительность? Решение своими руками Начнем с общей концепции:

  • Рассчитаем прогресс анимации в вершинном шейдере
  • Закодируем информацию о начальном кадре анимации («локальный прогресс») в альфа-канал цвета вершины (чтобы не потерять батчинг)
  • Создадим компонент, упрощающий настройку анимации в редакторе Unity.
  • Давайте создадим компонент, который будет рассчитывать «глобальный» прогресс анимации.

Начнем с шейдера рендеринга.

KalitaAtlasDrawer.shader

Shader "Kalita/KalitaAtlasDrawer" {

Теги: #unity3d #оптимизация #C++ #gamedev #Разработка игр #Разработка игр #C++ #unity

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.