Вы должны соединить все состояния между собой ... это похоже на 66
переходы ... не очень весело ... потому что ... теперь добавьте один переход спонтанно: D
IЭто означает, что вы могли бы сделать это и использовать HasExitTime = true; ExitTime = 1
для всех переходов, выходящих из состояний атаки, чтобы дождаться окончания анимации перед переходом - и для всех остальных есть HasExitTime = false
, чтобы не ждать, а запустить переход непосредственно.
Но я настоятельно рекомендую использовать небольшой сценарий и использовать bool
для isAttacking
, который облегчит вашу жизнь.
Вы можете просто добавить сценарий( StateMachineBehaviour ), чтобы он атаковал сами состояния (аналогично компонентам в GameObjects), где вы ждете, пока анимация не завершится, и сбросите bool.Чем вы можете оставить все переходы на Any State
и настроить их так, как хотите.
При выборе состояния в окне аниматора вы заметите, что в каждом состоянии есть Инспектор с кнопкой Add Behaviour
, очень похожей на GameObjects
:
здесь создайте новое поведение и просто выполните
using UnityEngine;
public class StopAttack : StateMachineBehaviour
{
private float timePassed = 0;
// OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine
//
// Unity's comment above sounds a bit confusing ... but
// simply consider this the Update method of StateMachineBehaviours ;)
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
timePassed += Time.deltaTime;
// while timePassed is smaller than the animation clip's length
// do nothing
if (timePassed < stateInfo.length) return;
// reset the bool
animator.SetBool("isAttacking", false);
}
}
Теперь для плавного смешивания простоустановите для переходов что-то вроде
- HasExitTime = true
- ExitTime = 0,75 (%)
- TransitionDuration = 0,25 (секунды, если
FixedDuration
,% в противном случае)
в зависимости от продолжительности этого перехода и т. Д. Вы также можете захотеть, чтобы анимация атаки сбрасывала isAttacking
чуть раньше, например,
if (timePassed < stateInfo.length - 0.25 * stateInfo.length) return;