В этой статье я хотел бы рассказать о том, как был ускорен рендеринг монстров при создании игры Alien Massacre. Это решение подойдет для любых проектов, использующих спрайтовую анимацию.
В результате разработки мобильной игры выяснилось, что воспроизведение большого количества анимированных объектов на сцене стало довольно узким местом.
В результате были сформированы следующие требования:
- 1 Необходимо обеспечить отрисовку большого количества анимированных объектов на сцене.
Ведь мы хотим, чтобы игрок отстреливался по полчищам монстров.
- 2 Ход анимации должен быть разным для каждого из объектов.
В конце концов, мы не хотим, чтобы мобы маршировали строем.
В качестве атласа с оригинальной анимацией мы будем использовать злого монстра с 24 кадрами спрайтовой анимации по 64х64 пикселей каждый:
В Unity3D мы установили тип текстуры спрайт, а в SpriteEditor разрезали ее на 24 части.
Делаем для него анимацию и кидаем все это на пустой объект. Теперь самое время вспомнить, что у нас было условие о разном ходе анимации для разных объектов.
Без проблем! Минута работы и сценарий готов.
АнимацияОфсет.cs
Теперь собираем все это вместе и получаем решение, которое предоставляет Unity3D «из коробки».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, давно привыкли к настройке аниматоров.
Но что, если вашему приложению требуется большая производительность? Решение своими руками Начнем с общей концепции:
- Рассчитаем прогресс анимации в вершинном шейдере
- Закодируем информацию о начальном кадре анимации («локальный прогресс») в альфа-канал цвета вершины (чтобы не потерять батчинг)
- Создадим компонент, упрощающий настройку анимации в редакторе Unity.
- Давайте создадим компонент, который будет рассчитывать «глобальный» прогресс анимации.
KalitaAtlasDrawer.shader Shader "Kalita/KalitaAtlasDrawer"
{
Теги: #unity3d #оптимизация #C++ #gamedev #Разработка игр #Разработка игр #C++ #unity
-
Вопросы От Леонардо Да Винчи
19 Oct, 24 -
Как Победить Пиратство?
19 Oct, 24 -
Мультфильмы И Сериалы
19 Oct, 24