Quick answer: Disable Can Transition To Self on any state with self-looping transitions, set Has Exit Time = false on instant transitions, and reorder transitions so the most specific condition is evaluated first. Triggers only fire on the highest-priority matching transition.
SetTrigger(“Jump”) returns. The animator does not jump. The Idle clip restarts, mid-animation, like a hiccup. Or the trigger fires twice and the player tries to jump twice. Every Unity dev hits this once; the cause is almost always the self-transition rule and one of two settings.
The Symptom
SetTrigger calls a state change that visibly does not happen. Or fires the wrong state. Or fires once after the right state already plays. Behavior depends on which animation frame the trigger lands on, which feels random.
What Causes This
Animator transitions are evaluated top-down within a state. A trigger condition that matches more than one outgoing transition consumes on the first match in list order. Subtle gotchas:
- Can Transition To Self — if a self-transition with the same condition exists, it fires first and the trigger never reaches its intended target.
- Has Exit Time = true — the transition is gated until the clip has played past Exit Time. Triggers fired earlier are still consumed but cause no visible change.
- Trigger reset — SetTrigger sets the trigger; the next evaluation that doesn’t match consumes it. If your transition has a parameter condition that’s false, the trigger is consumed silently.
The Fix
Step 1: Disable Can Transition To Self everywhere. Click the state. In Inspector → State → Transitions, expand each transition and uncheck Can Transition To Self unless you specifically want a re-trigger to restart the same animation.
Step 2: Has Exit Time = false on instant transitions. Click the transition arrow. In the Settings panel uncheck Has Exit Time. The transition now fires the moment the trigger is set, regardless of clip progress.
Step 3: Set Transition Duration explicitly. A duration of 0.25 is reasonable for most humanoid moves; 0 for snappy responses (hit, parry). Default 0.25 is often fine but the field is in normalized time of the source clip if Fixed Duration is off — flip Fixed Duration on and the value is in seconds, which is what you almost always want.
Step 4: Reorder transitions. Specific conditions first, generic last.
// Idle state's transition list, in order:
1. Idle -> Hit (Trigger: Hit) // most specific, fires first
2. Idle -> Jump (Trigger: Jump)
3. Idle -> Run (bool: IsRunning)
4. Idle -> Idle (none, default loop) // last, never blocks others
Code Side
Set the trigger only when the animator is in a state where it can be consumed. ResetTrigger before a SetTrigger if you suspect a stale trigger:
public void Jump()
{
animator.ResetTrigger("Jump");
animator.SetTrigger("Jump");
}
Verifying
Open the Animator window with the player selected during Play. Trigger the action; the active state should jump to the target visibly. If the source state restarts instead, your self-transition is winning. If nothing changes, your trigger is being consumed silently — check the transition’s parameter conditions.
“Disable self-transitions. Exit time off for instant. Order transitions specific-first. Triggers land where you intended.”
Related Issues
For animation not playing at all, see animation not playing. For animator events not firing, see animation events.
Self-transition off. Exit time off. Specific first. The Animator obeys.