Итак, анимация.

Предыдущий пост:

Разработав систему батчинга для Unity DOTS, грех не придумать батчинг анимации. Получив такую систему, мы сможем отрисовывать множество анимированных персонажей на сцене без большой потери производительности. Однако стандартный набор систем в DOTS не позволяет работать с анимацией без использования MonoBehaviour и обычного аниматора. Более того, при использовании "кожанных мешей" (skinned mesh) ни о каком батчинге речи идти не может.

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

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

Практическое использование: Нарезка анимации в Blender и сборка кадров занимает около десяти минут (при наличии готовой анимации). Основная проблема возникает при изменении геометрии персонажа — в таком случае придётся переделывать все анимации. Но, как мы знаем, если постоянно делать одно и то же действие, его нужно автоматизировать. Так же размер билда скорее всего выйдет за пределы вселенной.

Текущий статус и планы: Сейчас в прототипе я написал первичный вариант Utility AI системы логики и воюю с поиском пути (пасфайндером). В будущем я планирую написать автоматизацию для пересобирания кадров всех анимаций. Возможно, сделаю её первичный вариант в ближайшее время и продолжу битву против пассфайндера. Постараюсь обо всём этом написать. Если хотите что-то из этого быстрее остального - напишите в комментариях!

Следите за развитием событий:

Телеграм: https://t.me/ru_1ned

2
Начать дискуссию