Есть 2d персонаж с коллайдером и Rigidbody2d
. Также у него есть две анимации: покоя и ходьбы. Есть переходы между ними в Animator
в зависимости от скорости.
Есть третья анимация, анимация прыжка, на которую также есть переход в зависимости от bool
переменной IsGrounded
. Персонаж прыгает по нажатию клавиши пробел, но слишком быстро приземляется и IsGrounded
становится false
, анимация не успевает проиграться и переходит к анимации "покой".
Как сделать, чтобы персонаж прыгал и находился в воздухе или над землей пока не проиграться анимация, а не наоборот?
В Unity у Mecanim есть такая штука как BlendTree (Деревья смешивания). Они нужны для смешивания различных анимаций объекта. Именно его можно и использовать в данном случае. Однако для этого придется немного больше подзаморочиться. Вот список шагов:
Вместо состояния (State
) нужно создать Blend Tree
. И назвать его соответственно, например "Jump".
Вместо того, чтобы из набора спрайтов с прыжком делать одну анимацию, придется сделать по одной анимации на каждое изображение. То есть, если в анимации прыжка участвует 12 изображений, то придется создать 12 анимаций и разместить по одному изображению в каждом. Назвать например Jump1, Jump2, Jump3 и т.д.
При создании этих нескольких анимаций все состояния (States) появятся в окне аниматора (Animator) Их надо будет оттуда удалить.
Сделать двойной клик на Blend Tree
с именем Jump
. Попадешь в другую вкладку:
Нужно будет нажать Add Motion Field
по количеству анимаций прыжка. А также установить зависимость анимации от параметра vSpeed
, то есть от параметра вертикальной скорости. И выбрать желательный диапазон. Например от -5 до 5:
Здесь можно тонко настроить анимацию. Как видим можно поставить срабатывание любой анимации любого кадра в любое время (смотри параметр Thresh
а также голубенькие волны сверху справа - их можно двигать и регулировать). Также там можно задавать даже скорость каждой анимации.
На данном изображении видно, что пока значение вертикальной скорости больше нуля, то будут проигрываться анимации 1–6 (прыжок вверх), если скорость меньше нуля — 7–12 (падение)
Переход из прыжка в состояние Exit
если Ground == true
Ну и через скрипт нужно теперь передавать значение нашей переменной vSpeed
void FixedUpdate() {
//...
animator.SetFloat("vSpeed", rb.velocity.y);
}
Соответственно при клике на клавишу прыжка значение velocity.y
у rigidBody2D
меняется и передается в меканим и происходит прыжок