13

Нюансы работы Animator в Unity, и как с ними жить

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


В игре RATOMON у меня была задача сделать порталы, порождающие врагов, с таким алгоритмом работы:

1. Определяется, сколько врагов сгенерирует портал.

2. Портал играет анимацию открытия.

3. Портал играет первую половину анимации "Свечения/Glow".

4. Возле портала появляется очередной враг.

5. Портал играет вторую половину анимации "Свечения/Glow".

6. Если все враги сгенерировались, то играется анимация закрытия портала. Иначе повторяется пункт 3 и последующие.


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


PortalAnimator.Play(RAnimations.PortalGlow);

duration = PortalAnimator.GetCurrentAnimatorStateInfo(0).length;


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


Так вот работало всё криво и косо: то анимации пропускались, то враги генерились с неправильными интервалами. Помогло обращение к форумам, где иногда встречается совет дождаться конца кадра или пропустить кадр. Например, тут EvilWarren пишет об этом.


Второй нюанс связан с тем, что аниматор получив один вызов Play будет игнорировать все последующие, сделанные в том же кадре. Скорее всего, я огрёб и от этого тоже. После применения советов с форумов порталы заработали, а код стал выглядеть "криво и косо".


animatedRoomPortal.PlayAnimation(RAnimations.Dummy);

yield return null;

PortalAnimator.Play(RAnimations.PortalGlow);

yield return null;

duration = PortalAnimator.GetCurrentAnimatorStateInfo(0).length;


Здесь запуск Dummy анимации может и не нужен, а остался с предыдущих экспериментов, когда анимация PortalGlow не хотела запускаться два раза подряд.


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


Выводы:

1. Если вы запускаете анимацию, а она не играется, - это норма. Подождите кадр перед запуском.

2. Если вам надо узнать продолжительность анимации, то после запуска подождите кадр и только после этого обращайтесь к Animator.GetCurrentAnimatorStateInfo(0).length.

3. Может игра и без анимаций выглядит ничё так.


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


Для тех, кто хочет посмотреть на порталы,

страница игры в Steam: https://store.steampowered.com/app/1586740/RATOMON/

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

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

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества