Для чего используется blend tree в аниматоре?
Что проверяют
Работали ли вы с Mecanim в Unity руками или знаете термин по названию. Интервьюер хочет услышать, чем blend tree отличается от обычного перехода между состояниями, и почти всегда спрашивает, как управлять им из кода.
Как отвечать
Blend tree это особый тип состояния в Animator Controller, который непрерывно смешивает несколько клипов по значению float-параметров. Переход (transition) делает кроссфейд между двумя состояниями за фиксированное время, а blend tree держит смесь всё время, пока меняется параметр. Типичные задачи: локомоция (стоять, идти, бежать), движение в восьми направлениях, наклоны при прицеливании.
Типы, которые стоит назвать:
- 1D: один параметр, например
Speed, клипы расставлены по порогам (thresholds). Пороги можно посчитать автоматически по скорости root motion; - 2D Simple Directional: два параметра, по одному клипу на направление;
- 2D Freeform Directional и Freeform Cartesian: несколько клипов в одном направлении с разной скоростью или параметры, которые вовсе не означают направление;
- Direct: вес каждого клипа задаётся своим параметром, удобно для лицевой анимации и blend shapes.
Из кода параметр задают через Animator.SetFloat. Имя лучше один раз превратить в хэш через Animator.StringToHash("Speed") и хранить в static readonly int, а для плавности брать перегрузку с демпфированием: animator.SetFloat(speedId, speed, 0.1f, Time.deltaTime).
Клипы локомоции должны совпадать по фазе шага: левая нога касается земли в одной и той же нормализованной точке цикла. Длительности Unity приводит к общей сам, а фазу нет.
Где спотыкаются
Засовывают в blend tree атаку, прыжок или смерть. Это дискретные события, им место в отдельных состояниях с переходами или в слое с маской.
Смешивают несинхронные клипы, получают скольжение ног и пытаются лечить это подбором порогов.
Считают blend tree экономией ресурсов. Все клипы с ненулевым весом вычисляются одновременно, и сложное дерево на сотне персонажей заметно нагружает CPU.