logo
Margot - Tenebrae
Разработчик НЕ игр! Личный блог.
logo Margot - Tenebrae

Разработка: персонажи и аниматор

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

В‏ ‎прошлый ‎раз‏ ‎я ‎добивалась ‎целей:

- Снизить ‎количество ‎вложенных‏ ‎в‏ ‎префаб ‎объектов.

- Снизить‏ ‎количество ‎контроллеров‏ ‎анимации.

- Навести ‎порядок ‎в ‎папках ‎с‏ ‎изображениями.

- Сделать‏ ‎единое‏ ‎позиционирование ‎изображений‏ ‎мимики.

- Исправить ‎«залипание»‏ ‎на ‎последний‏ ‎проигранной‏ ‎анимации.

Та ‎архитектура‏ ‎была ‎неплоха, ‎я ‎узнала ‎много‏ ‎про ‎оверрайд‏ ‎спрайты,‏ ‎про ‎работу ‎со‏ ‎слоями, ‎про‏ ‎задержки ‎и ‎многое ‎другое.‏ ‎Но‏ ‎эта ‎сложная‏ ‎стейт ‎машина‏ ‎оказалась ‎излишней ‎для ‎моего ‎проекта.

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

В ‎"Тенебре"‏ ‎есть‏ ‎лишь ‎один‏ ‎случай ‎плавного‏ ‎перехода ‎из ‎состояния ‎в ‎состояние,‏ ‎когда‏ ‎персонаж‏ ‎меняет ‎позу.‏ ‎Я ‎это‏ ‎реализовала ‎через‏ ‎дублирование‏ ‎изображения. ‎Под‏ ‎слоем ‎с ‎фигурой ‎персонажа, ‎есть‏ ‎ещё ‎один‏ ‎точно‏ ‎такой ‎же ‎слой,‏ ‎и ‎он‏ ‎включается ‎в ‎тот ‎момент,‏ ‎когда‏ ‎на ‎верхний‏ ‎подаётся ‎новое‏ ‎изображение. ‎Потом ‎он ‎плавно ‎затухает,‏ ‎создав‏ ‎эффект ‎шлейфа,‏ ‎и ‎по‏ ‎завершению ‎принимает ‎новую, ‎актуальную ‎картинку.

Немного‏ ‎о‏ ‎том,‏ ‎как ‎это‏ ‎выглядит ‎под‏ ‎капотом:

Но ‎главная‏ ‎причина,‏ ‎по ‎которой‏ ‎я ‎отказалась ‎от ‎готового ‎решения,‏ ‎это ‎переход‏ ‎на‏ ‎хранение ‎ассетов ‎в‏ ‎adressebbles ‎бандлах.‏ ‎В ‎файле ‎с ‎основной‏ ‎сборкой‏ ‎игры ‎будут‏ ‎лежать ‎только‏ ‎изображения ‎используемые ‎для ‎интерфейсов: ‎рамки,‏ ‎заглушки,‏ ‎иконки, ‎кнопки‏ ‎и ‎т.д.

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

Но‏ ‎в ‎аниматор ‎нельзя‏ ‎положить ‎адрессебл‏ ‎изображение, ‎а ‎значит ‎при‏ ‎его‏ ‎использовании, ‎в‏ ‎игре ‎будет‏ ‎дублироваться ‎много ‎изображений. ‎Они ‎будут‏ ‎храниться‏ ‎и ‎в‏ ‎основной ‎сборке,‏ ‎и ‎в ‎адрессеблах. ‎Отказавшись ‎от‏ ‎стейт‏ ‎машины,‏ ‎я ‎решила‏ ‎эту ‎проблему.‏ ‎И ‎не‏ ‎только‏ ‎её. ‎Сборка‏ ‎персонажей ‎стала ‎в ‎разы ‎проще,‏ ‎гибче, ‎удобнее‏ ‎и‏ ‎быстрее. ‎Я ‎всё‏ ‎ещё ‎прокидываю‏ ‎вручную ‎много ‎зависимостей, ‎но‏ ‎их‏ ‎стало ‎в‏ ‎разы ‎меньше.

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

Количество ‎префабов‏ ‎с ‎персонажами ‎было ‎сокращено ‎с‏ ‎20‏ ‎(у ‎каждого‏ ‎единовременно ‎работал‏ ‎аниматор, ‎даже ‎в ‎скрытом ‎состоянии)‏ ‎до‏ ‎3-4.‏ ‎Скорее ‎всего‏ ‎размещу ‎четыре,‏ ‎потому ‎что‏ ‎на‏ ‎сцене ‎как‏ ‎правило ‎находится ‎не ‎более ‎трёх‏ ‎персонажей, ‎а‏ ‎один‏ ‎будет ‎запасным ‎для‏ ‎рокировок ‎при‏ ‎режиссуре.

И ‎немного ‎об ‎устройстве‏ ‎префабов‏ ‎в ‎данный‏ ‎момент:

Character - основной ‎контроллер‏ ‎персонажа, ‎который ‎получает ‎и ‎обрабатывает‏ ‎информацию‏ ‎извне. ‎Обычно,‏ ‎это ‎набор‏ ‎индексов. ‎Ещё ‎он ‎управляет ‎координатами‏ ‎и‏ ‎размером‏ ‎префаба.

Sprites - в ‎нём‏ ‎находится ‎свитчер/переключатель,‏ ‎который ‎управляет‏ ‎слоями‏ ‎с ‎изображениями.‏ ‎Внутри ‎него ‎хранятся ‎SO ‎с‏ ‎персонажами ‎и‏ ‎их‏ ‎характеристиками. ‎Это ‎набор‏ ‎циферных, ‎строчных‏ ‎и ‎булевых ‎значений, ‎собранных‏ ‎в‏ ‎листы.

Body - четыре ‎слоя,‏ ‎рассчитанные ‎на‏ ‎две ‎формы ‎персонажей. ‎У ‎нас‏ ‎есть‏ ‎спрайты ‎2к‏ ‎на ‎4к,‏ ‎а ‎есть ‎4к ‎на ‎4к.‏ ‎Через‏ ‎bool‏ ‎проверку, ‎свитчер‏ ‎включает ‎или‏ ‎отключает ‎нужные‏ ‎слои,‏ ‎поскольку ‎менять‏ ‎размер ‎картинки ‎напрямую ‎- ‎это‏ ‎очень ‎рискованно‏ ‎и‏ ‎ненадежно. ‎Можно ‎испортить‏ ‎префаб.

Confuse, ‎Eyesm‏ ‎Brows, ‎Mouth, ‎Specific - это ‎небольшие‏ ‎слои‏ ‎для ‎отрисовки‏ ‎разнообразной ‎мимики.

Scriptble‏ ‎Objects:

Внутри ‎SO ‎с ‎персонажем ‎лежат‏ ‎три‏ ‎списка:

- SO ‎с‏ ‎позами ‎персонажа.

- SO‏ ‎со ‎списками ‎анимаций ‎для ‎глаз‏ ‎и‏ ‎губ.

SO‏ ‎с ‎позой:

SO‏ ‎со ‎слоями‏ ‎для ‎позы:

SO‏ ‎с‏ ‎айдишниками ‎для‏ ‎анимации:

На ‎последнем ‎стриме ‎эту ‎систему‏ ‎верно ‎назвали‏ ‎"конструктором",‏ ‎потому ‎что ‎персонаж‏ ‎собирается ‎из‏ ‎кусочков. ‎Это ‎даёт ‎большую‏ ‎гибкость‏ ‎при ‎конструировании‏ ‎префабов ‎и‏ ‎при ‎режиссуре.

И ‎мне ‎придётся ‎переделывать‏ ‎всю‏ ‎демку, ‎потому‏ ‎что ‎у‏ ‎нас ‎очень ‎сильно ‎изменилась ‎индексация.

- Раньше‏ ‎не‏ ‎было‏ ‎индекса ‎под‏ ‎названием ‎Prefab,‏ ‎потому ‎что‏ ‎у‏ ‎каждого ‎персонажа‏ ‎был ‎свой ‎собственный ‎шаблон, ‎с‏ ‎персональным ‎аниматором.

- Не‏ ‎было‏ ‎слоя ‎Red ‎или‏ ‎Confuse. ‎Это‏ ‎небольшая ‎картинка, ‎которая ‎отрисовывается‏ ‎поверх‏ ‎лица, ‎но‏ ‎под ‎мимикой.‏ ‎Это ‎кровь, ‎румянец ‎при ‎смущении.‏ ‎Благодаря‏ ‎этой ‎картинке,‏ ‎удалось ‎избавиться‏ ‎более ‎чем ‎ста ‎больших ‎изображений.

- Я‏ ‎добавила‏ ‎индекс‏ ‎Rotate, ‎чтобы‏ ‎зеркалить ‎префабы.‏ ‎Это ‎иногда‏ ‎нужно‏ ‎при ‎постановке‏ ‎кадра. ‎Совсем ‎не ‎годится ‎для‏ ‎асимметричного ‎дизайна‏ ‎персонажей,‏ ‎но ‎безумно ‎важно‏ ‎для ‎проходных‏ ‎персонажей, ‎у ‎которых ‎мало‏ ‎спрайтов.

- Появился‏ ‎индекс ‎Shader,‏ ‎который ‎работает‏ ‎нифига ‎не ‎через ‎шейдер. ‎Он‏ ‎просто‏ ‎плавно ‎затемняет‏ ‎все ‎слои‏ ‎персонажа, ‎чтобы ‎показать ‎лишь ‎силуэт.‏ ‎Раньше‏ ‎я‏ ‎сохраняла ‎отдельные‏ ‎картинки ‎для‏ ‎каждого ‎такого‏ ‎случая,‏ ‎потому ‎что‏ ‎внедрять ‎новый ‎индекс ‎посреди ‎полуготового‏ ‎проекта ‎-‏ ‎это‏ ‎накладно. ‎Слишком ‎много‏ ‎таблиц ‎требовалось‏ ‎переписать ‎вручную.

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

Предыдущий Следующий
Все посты проекта
0 комментариев

Подарить подписку

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

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

Будет создан код, который позволит адресату получить сумму на баланс.

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

Добавить карту
0/2048