Нюансы работы 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 будет игнорировать все последующие, сделанные в том же кадре. Скорее всего, я огрёб и от этого тоже. После применения советов с форумов порталы заработали, а код стал выглядеть "криво и косо".
yield return null;
PortalAnimator.Play(RAnimations.PortalGlow);
yield return null;
duration = PortalAnimator.GetCurrentAnimatorStateInfo(0).length;
Здесь запуск Dummy анимации может и не нужен, а остался с предыдущих экспериментов, когда анимация PortalGlow не хотела запускаться два раза подряд.
Если кто-то сможет указать, где в документации Unity описывается этот костыль, буду благодарен. Когда писал код, я этого не нашёл.
Выводы:
1. Если вы запускаете анимацию, а она не играется, - это норма. Подождите кадр перед запуском.
2. Если вам надо узнать продолжительность анимации, то после запуска подождите кадр и только после этого обращайтесь к Animator.GetCurrentAnimatorStateInfo(0).length.
Подробнее можно почитать в вышеупомянутой документации к Animancer. Там и другие недостатки анимационной системы описаны, есть о чём задуматься.
Для тех, кто хочет посмотреть на порталы,
страница игры в Steam: https://store.steampowered.com/app/1586740/RATOMON/
Лига Разработчиков Видеоигр
9.1K пост23.2K подписчиков
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"