Как сделать спрайты для анимации

Введение в spritesheet анимацию

Анимация, основанная на spritesheet’ах, используется в играх довольно продолжительное время. В том числе в таких популярных играх, как Legend of Zelda: A Link to the Past или Cut the Rope. В этой статье мы поговорим о том, как работает такая анимация и как ее запрограммировать. В качестве языка программирования будем использовать JavaScript, но вы можете выбрать любой удобный для вас.

Прежде чем говорить о том, как программировать spritesheet анимацию, нам следует определить три термина: анимация, спрайт и, собственно, spritesheet.

Анимация

В далеком 1872 году английскому и американскому фотографу Эдварду Мейбриджу было поручено узнать, поднимает ли лошадь все свои 4 ноги во время бега. Мейбридж для этого использовал несколько камер, которые делали снимок, когда лошадь с наездником пробегала мимо. В итоге фотограф получил 16 изображений лошади. Кстати говоря, в парочке из них все четыре ноги лошади действительно находятся в воздухе.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Позднее Мейбридж повторил эксперимент, но поместил все фотографии в устройство, которое могло проецировать их в быстрой последовательности так, что получалась иллюзия бега лошади. Это устройство позднее назвали кинопроектор.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Процесс быстрой смены изображений для создания иллюзии движения назвали анимацией.

Спрайт

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

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

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

Совсем не редкость, когда в игре существуют десятки, а то и сотни спрайтов. Загрузка каждого из них в качестве индивидуального и самостоятельного изображения будет потреблять много памяти и вычислительной мощности. Для того, чтобы избежать этих неудобств, и используют spritesheet’ы.

Spritesheet’ы

Когда вы кладете множество спрайтов в одно изображение, вы получаете spritesheet.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Spritesheet’ы используют для ускорения процесса отображения картинки на экране. Гораздо эффективнее и быстрее загрузить одно большое изображение и показать его часть, чем загрузить множество спрайтов и показать их.

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

Части spritesheet’а

Сам по себе spritesheet состоит из двух частей: кадров и циклов.

Источник

Спрайт-анимация на JavaScript и canvas

С помощью HTML5 элемента canvas и нескольких строк JS-кода несложно сделать спрайт-анимацию для игр или интерактивных приложений. Этим мы сегодня и займемся.

Фреймы анимации размещаются в одном изображении и выводятся по одному за раз с нужной частотой, создавая эффект движения. Разберемся шаг за шагом, как все это работает.

Что такое спрайт-анимация

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

Так как все кадры находятся в одной картинке (sprite sheet), нам потребуются возможности метода drawImage – он позволяет обрезать изображение, то есть выбирать нужный фрейм.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Спрайт

Спрайты на HTML5 холсте те же самые, что мы используем в CSS – это просто несколько разных картинок, объединенных в одном файле. Например, в этом спрайте 10 кадров. Ширина всего спрайта составляет 460 пикселей, соответственно, каждый фрейм занимает 460/10 – 46 пикселей.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Начинаем анимировать

Сначала загрузим спрайт с фреймами анимации монетки. Для этого создадим новый объект Image и установим нужное значение для его свойства src :

Теперь создадим класс спрайтов. Его объектам потребуется 4 свойства:

Для рисования нужен холст и его контекст. Создадим HTML-элемент и установим ему размеры, равные размерам одного фрейма. На самом деле, холст, конечно, может быть любого размера, нужно лишь определить фрагмент для рендеринга анимации.

Создадим реальный объект спрайт-анимации монетки с нужными параметрами:

Метод drawImage

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Render

Пора рисовать. Сначала просто выведем на холст первый фрейм, обрезав спрайт по нужным размерам:

Теперь посмотрим, что получилось.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Статичная картинка. Хм, но где анимация?

Update

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

Что делать, если кадры спрайта кончились? Запустить ее с самого начала:

RequestAnimationFrame

Метод requestAnimationFrame позволяет привязать перерисовку анимации к циклу обновления браузера. Его реализация в разных браузерах несколько различается, поэтому стоит пользоваться кроссбраузерным вариантом:

Создадим отдельный метод start для запуска анимации:

Уже очень близко к идеалу, осталась лишь одна маленькая деталь.

Очистка холста

Метод clearRect позволяет очистить область холста от предыдущего кадра. Он принимает 4 параметра:

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Теперь наша спрайт-анимация работает так, как нужно.

Источник

Создание забавных и привлекательных анимаций простыми функциями Spine (внутри тяжёлые gif)

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

(Прим. пер.: 1. Spine — это проприетарный кроссплатформенный пакет для создания двухмерных скелетных анимаций с поддержкой различных игровых тулкитов.
2. Осторожно, в посте есть около 38 МБ gif’ок, все они спрятаны под кат.)

Как создать плавное переключение или поворот спрайтов?

Создание плавного и естественного переключения и поворот спрайтов при работе со Spine или любым другим инструментом интерполяции анимации часто бывает трудной задачей. Оно может развалить порядок анимации и сделать окончательный результат дёргающимся или неуклюжим.

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

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

1. Два спрайтовых изображения: с закрытым и открытым ртом. Это ключевые фазы (key poses) анимации.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

2. Простое переключение: сначала я пытался использовать способ попроще: переключал спрайты и добавлял эффект сквозного движения (follow-through), но результат получался немного резким, и выглядел несвязанным со всей анимацией, несмотря на реакцию глаз и волос на общее движение.

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

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

3. Результат: в картинке ниже я добавил немного эффекта упругости между спрайтами, чтобы они выглядели более гибкими и естественными.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации
1. Горизонтальное растяжение. 2. Вертикальное растяжение. 3. Переключение спрайта.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

4. Простой поворот: при повороте персонажа легко утерять повторяющуюся плавность и привлекательность анимаций персонажа. В примере ниже поворот выполняется резким образом и без всяких переходов. При этом теряется индивидуальность персонажа и его комичный вид.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

5. Результат: тогда я применил тот же принцип упругости, описанный выше, сделав поворот более плавным и забавным, в соответствии с общим стилем игры.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

6. Смазывание: ещё один хороший совет — симулировать эффект смазывания (smear) в Spine. При этом не требуется создание нового спрайта.

Мой персонаж должен повернуть голову и отдать приказ своей команде, но для него может использоваться несколько скинов других персонажей для повторного использования скелета и костей. Игрок может создавать любые нужные ему комбинации (вариации шлемов, цвета кожи, экипировки и т.д.). Если бы я начал создавать все возможные комбинации голов для генерации смазывания, я бы потратил кучу времени и создал множество необязательных изображений.

Поэтому я решил выполнять смазывание Spine, деформируя основную кость головы при повороте и добавлении дополнительных деталей, например сквозного движения шлема и носа.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Это кадр смазывания, созданный только с помощью деформации кости.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Деформируйте всё, что можно!

Есть два аспекта, которых я всегда придерживаюсь для того, чтобы создать определённый стиль и сделать объекты забавными: это преувеличение и деформация. Часто для демонстрации индивидуальности персонажа, визуального воздействия и заинтересованности игрока необходимо максимально преувеличивать движения.

Иногда при преувеличении создаются довольно странные ключевые кадры (keyframes), но они обеспечивают выразительность анимаций. Ниже приведены примеры окончательных анимаций. Из-за использования этих аспектов они выглядят очень динамичными.

7. Анимации с деформацией и преувеличением, приятные глазу игрока, и привлекающие его к персонажу.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимацииКак сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимацииКак сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

8. Посмотрите на эти странные, но удивительные ключевые кадры!

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимацииКак сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимацииКак сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Добавьте движения!

Старайтесь смягчать линейный эффект анимации для улучшения окончательного результата и «оживления» объектов.

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

9. Старайтесь вдохнуть жизнь в каждый элемент персонажа. Добавляйте захлёст (overlapping) и сквозное движение.

Один из основных элементов моего персонажа — это шлем, поэтому я хотел, чтобы он выглядел независимым элементом анимации.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимацииКак сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимацииКак сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

10. Ещё один аспект, которого я всегда пытаюсь достичь — как можно более нелинейный внешний вид объектов. При создании персонажа я люблю думать о его движении, поведении, весе, индивидуальности и т.д. Это помогает мне планировать экспорт и создавать его скелет с правильной иерархией шарниров и костей.

Приведённый ниже персонаж довольно прост. Его можно считать простой фигурой с одной-двумя костями. Все его части движутся вместе, а анимация создаётся около часа. Но это довольно важный персонаж, он главная звезда «игры», и я хотел сделать его настолько интересным, чтобы дети захотели взять его домой.

У нас есть три примера анимации ожидания:

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимацииКак сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

11. При создании анимаций ожидания я обычно работаю с круговым движением, пытаясь учитывать форму персонажа и делая её менее плоской и более трёхмерной. Есть несколько ключевых элементов для достижения такого результата, например имитация поворота носа и движение глаз вверх-вниз, открывающее верхнюю часть головы.

Нос разделён на два изображения: nose_back и nose_front.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Ещё один пример анимации ожидания. Здесь я много использовал деформацию и преувеличение, сделав персонаж забавным и бесшабашным. Всё двигается независимо (деформация щёк, открывание рта, брови со сквозным движением, нос с круговым эффектом и растяжение тела).

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Ещё один пример обычного и живого движения в анимации прыжка этого персонажа.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Слева — обычный прыжок, просто перемещение и деформация главной кости персонажа. Эта анимация не очень привлекательна, всё выглядит очень резким и плоским.

Правая анимация улучшена добавлением множества деталей: лицо персонажа двигается в замедленном движении вместе с основным движением, создавая ощущение поворота при прыжке вверх-вниз. Применены перехлёст и эффект смазывания носа при прыжке вверх-вниз и общая сквозная реакция при ударе персонажа о землю, придающая ему веса и отмечающая его воздействие на землю.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимацииКак сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Этому персонажу нужна была специальная функция для «бесконечного» растяжения его тела вверх, но игровой движок не поддерживает сетки (meshes), и мне потребовался способ осуществить её. Персонаж был разделён на три части: верхнюю, среднюю и нижнюю. Нижняя часть фиксирована, средняя абсолютно растяжима, а верхняя часть содержит общие элементы лица.

Источник

Модульные спрайтовые персонажи и их анимация

Эта запись девлога целиком посвящена моей системе анимации персонажей, она наполнена полезными советами и фрагментами кода.

За последние два месяца я создал целых 9 новых действий игрока (такие забавные вещи как блокировка щитом, уворачивание в прыжке и оружие), 17 новых носимых предметов, 3 набора брони (пластинчатый, шёлковый и кожаный) и 6 видов причёсок. Также я завершил создавать всю автоматизацию и инструменты, поэтому всё уже используется в игре. В статье я расскажу, как этого добился!

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

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

Краткое описание

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

Разумеется, такие функции активно используются в 3D- и 2D-играх с пререндеренными спрайтами или в 2D-играх со скелетной анимацией, но насколько я знаю, существует не так много игр, совмещающих созданную вручную анимацию и модульных персонажей (обычно потому, что процесс оказывается слишком монотонным).

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Я раскопал этот древний GIF моего первого месяца работы с Unity. На самом деле этот модульный спрайт оказался одним из первых моих экспериментов в разработке игр!

Я создал прототип при помощи системы анимаций Unity, а затем для проверки концепции добавил одну рубашку, одну пару штанов, одну причёску и три предмета. Для этого потребовалось 26 отдельных анимаций.

В то время я создавал всю свою анимацию в Photoshop и не заморачивался автоматизацией процесса, поэтому он был очень скучным. Потом я подумал: «Так, основная идея сработала, позже я добавлю новые анимации и снаряжение». Оказалось, что «потом» — это несколько лет спустя.

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

Я ожидал, что придётся отказаться от кастомизации персонажа и создать единственного главного героя, как в большинстве игр с ручной анимацией. Но у меня был план действий, и настало время проверить, смогу ли я победить этого монстра!

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Спойлер: всё получилось замечательно. Ниже я раскрою свои ***секреты***

Модульная система спрайтов

I. Познай свои границы

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

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

Аспект отслеживания времени оказался очень важным, и я крайне рекомендую использовать его, чтобы отвечать на вопросы типа: «Сколько врагов могу я позволить себе создать в игре?». Всего после нескольких тестов мне удалось экстраполировать достаточно точную оценку. При дальнейшей работе над анимациями я продолжил следить за временем и пересматривать мои ожидания.

Поделюсь копией моего журнала работы за последние два месяца. Учтите, что это время идёт в добавок к моей обычной работе, где я провожу по 30 часов в неделю:

II. Смена палитры ради светлого будущего

С умом используя цвета в дизайне спрайтов, можно отрисовать один спрайт и создать множество различных вариаций при помощи смены палитры. Можно менять не только цвета, но и создавать различные включаемые и отключаемые элементы (например, заменой цветов на прозрачность).

Каждый набор брони имеет 3 вариации, а смешивая верхние и нижние части, можно получить множество комбинаций. Я планирую реализовать систему, в которой можно собрать один набор брони для внешнего вида персонажа, а другой — для его характеристик (как в Terraria).

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

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

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

Я не буду объяснять всё в подробностях, а вместо этого расскажу о способах реализации этой техники в Unity, и об их плюсах и минусах.

1. Текстура поиска для каждой палитры

Это наилучшая стратегия для создания вариаций врагов, фонов и всего того, где множество спрайтов иеет одинаковую палитру/материал. Различные материалы нельзя сгруппировать в батчи, даже если они используют одинаковый спрайт/атлас. Работа с текстурами довольно мучительна, но палитры можно изменять в реальном времени, заменяя материалы, с помощью SpriteRenderer.sharedMaterial.SetTexture или MaterialPropertyBlock, если вам нужны разные палитры для каждого экземпляра материала. Вот пример фрагментной функции шейдера:

2. Массив цветов

Я остановился на этом решении, потому что мне нужно было заменять палитры каждый раз, когда меняется внешний вид персонажа (например, при надевании предметов), и создавать некоторые палитры динамически (чтобы отобразить выбранные игроком цвета волос и кожи). Мне показалось, что во время выполнения и в редакторе для этих целей гораздо проще будет работать с массивами.

Я представил свои палитры как тип ScriptableObject и использовал для их редактирования инструмент MonoBehaviour. Проработав долгое время над редактированием палитр в процессе создания анимаций в Aseprite, я понял, какие инструменты мне требуются и писал эти скрипты соответствующим образом. Если вы хотите написать собственный инструмент для редактирования палитр, то вот какие функции я обязательно рекомендую реализовать:

— Обновление палитр на различных материалах при редактировании цветов для отображения изменений в реальном времени.

— Присваивание названий и изменение порядка цветов в палитре (используйте поле для хранения индекса цвета, а не его порядка в массиве).

— Выбор и редактирование нескольких цветов за раз. (Совет: поля Color в Unity можно копипастить: просто нажмите на один цвет, скопируйте, нажмите на другой цвет, вставьте — теперь они одинаковы!)

— Применение цвета оверлея ко всей палитре

— Запись палитры в текстуру

3. Единая текстура поиска для всех палитр

Если вы хотите переключать палитры на лету, но в то же время вам необходим батчинг для снижения количества вызовов отрисовки, то можно использовать эту технику. Она может оказаться полезной для мобильных платформ, но использовать её довольно неудобно.

Во-первых, нужно будет упаковать все палитры в одну большую текстуру. Затем вы используете цвет, заданный в компоненте SpriteRenderer (AKA цвет вершины) для определения строки, которую надо считать из текстуры палитры в шейдер. То есть палитра этого спрайта управляется через SpriteRenderer.color. Цвет вершины — это единственное свойство SpriteRenderer, которое можно менять без нарушения батчинга (при условии, что все материалы одинаковы).

В большинстве случаев лучше всего использовать для управления индексом альфа-канал, потому что вам скорее всего не понадобится куча спрайтов с различной прозрачностью.

Как сделать спрайты для анимации. Смотреть фото Как сделать спрайты для анимации. Смотреть картинку Как сделать спрайты для анимации. Картинка про Как сделать спрайты для анимации. Фото Как сделать спрайты для анимации

Чудеса замены палитр и слоёв спрайтов. Так много комбинаций.

III. Автоматизируйте всё и применяйте подходящие инструменты

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

Первым моим шагом стало создание экспортёра для Aseprite, чтобы управлять моей безумной схемой слоёв спрайтов при помощи удобного интерфейса командной строки. Это просто скрипт на perl, который обходит все слои и метки в моём файле Aseprite и эспортирует изображения в определённой структуре каталогов и имён, чтобы я смог в дальнейшем их считывать.

На стороне Unity серьёзные проблемы у меня возникли в двух местах: в загрузке/нарезке спрайтшита и в построении клипа анимации. Мне бы очень помог понятный пример, поэтому вот фрагмент кода из моего импортёра, чтобы вы не так мучились:

Если вы этого ещё не делали, то поверьте — начать создавать собственные инструменты очень легко. Самый простой трюк заключается в размещении в сцене GameObject с привязанным к нему MonoBehaviour, которое имеет атрибут [ExecuteInEditMode]. Добавьте кнопку, и вы готовы к бою! Помните, что ваши личные инструменты не обязаны выглядеть хорошо, они могут быть чисто утилитарными.

При работе со спрайтами автоматизировать стандартные задачи довольно легко (например, создание текстур палитр или пакетную замену цветов в нескольких файлах спрайтов). Вот пример, с которого можно начать учиться изменению своих спрайтов.

Как я перерос возможности Mecanim: жалоба

Со временем прототип системы модульных спрайтов, который я создал с помощью Mecanim, стал самой большой проблемой при апгрейде Unity, потому что API постоянно сильно менялся и был плохо задокументирован. В случае простого конечного автомата было бы разумно иметь возможность запрашивать состояния каждого клипа или менять клипы во время выполнения. Но нет! Из соображений производительности Unity запекает клипы в их состояния и заставляет нас использовать для их смены неуклюжую систему переопределений.

Сам по себе Mecanim не такая уж плохая система, но мне кажется, что ему не удаётся реализовать свою основную заявленную особенность — простоту. Идея разработчиков заключалась в том, чтобы заменить то, что казалось сложными и мучительным (скриптинг) чем-то простым (визуальным конечным автоматом). Однако:

— Любой нетривиальный конечный автомат быстро превращается в дикую паутину узлов и соединений, логика которой разбросала по разным слоям.

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

— Забавно, что в результате вам всё равно приходится писать код, ведь чтобы конечный автомат делал что-то интересное, нужен скрипт, вызывающий Animator.SetBool и подобные ему методы.

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

— Если вы хотите изменять то, что находится в состоянии во время выполнения, то у вас проблемы. Решением будет или плохой API, или безумный граф с одним узлом для каждой возможной анимации.

Рассказ о том, как разработчики Firewatch попали в ад визуального скриптинга. Самое забавное в том, что когда докладчик показывает наиболее простые примеры, они всё равно выглядят безумно. Зрители в буквальном смысле стонут на 12:41. Добавьте огромные затраты на обслуживание, и вы поймёте, почему я сильно не люблю эту систему.

Многие из этих проблем даже не вина разработчиков Mecanim, а просто естественный результат несовместимых идей: нельзя создать общую и в то же время простую систему, а описывать логику при помощи изображений сложнее, чем просто словами/символами (кто-нибудь помнит флоучарты UML?). Я вспомнил фрагмент из доклада Зака Макклендона на Practice NYC 2018, и, если найдётся время, рекомендую вам посмотреть видео целиком!

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

Если вы уже немного программист и делаете игры со спрайтами, то вам возможно стоит подумать дважды. Когда я начинал, то меня был уверен, что никогда не смогу написать что-то связанное с движком лучше, чем разработчики Unity.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *