Пару месяцев делаю систему синхронизации анимаций а-ля motion matching от юбисофта. И тут появилась проблема с архитектурой анимационной системы в движке.
Суть проблемы:
У каждой анимации есть своя уникальная кривая, равная единице на протяжении всей анимации, таким образом я получаю веса всех анимаций в анимационной системе, т.к. сами значения кривых умножаются на коэффициент веса анимации в системе, что очень удобно. Если вес анимации равен нулю, то для такой анимации ненужно рассчитывать искомый кадр синхронизации, а алгоритмы там довольно ресурсоёмкие. Но проблема в том что при всех тик ивентах в Анимационном блупринте кроме тика PostEvaluateAnimation даются значения кривых с последнего состояния анимационной системы. Таким образом если хоть какая-то анимация в кадре обретает не нулевой вес, то расчет синхронизации анимации будет только в следующем кадре, потому что значение анимационной кривой будет всё еще равна нулю! Из-за этого присутствует подергивания скелета когда хоть какая-то анимация обретает не нулевой вес. PostEvaluateAnimation использовать нет смысла, т.к. этот тик идёт уже после обновления animGraph.
Та же проблема и с получением transform любой кости. Из-за этого лага присутствует подёргивания в системе компенсации проскальзывания ног.
Что мне нужно: Получать значения animation curves и socket transform, с нового состояния анимаГрафа, но еще до того сам сам анимГраф и финальная поза окончательно обновятся. Как бы заглядываю в будущее состояние анимационный системы, и использую новые данные в своих целях. В итоге "истинное" финальное состояние анимационной системы будет уже другим, т.к. эти данные я применю к анимГрафу.
Нашел полезную инфу по последовательности обновления анимаций тут
https://gist.github.com/ikrima/a900a50c1d4b7293d44bВнизу видно что кривые обновляются как раз перед poseEvaluateAnimation, саму функцию переопределить нельзя. Из animinstance были перепробованы все тик ивенты которые нашел в API, ни один не подходит. Сразу скажу что в программировании я ноль, мне помогал программист, но решить траблу так и не смог.
Вообщем надеюсь на вашу помощь.