Control animation state with Unity 6.3 LTS's Animator and Animator Controllers: parameters,
transitions, blend trees, layers, and humanoid IK. Targets Unity 6.3 LTS (6000.3).
*.controller (Animator Controller) and *.anim assets, or a
rigged model with an Avatar.When not to use: simple non-skeletal value tweens (UI fades, position lerps) are better
done with a tween/coroutine — see unity-csharp-scripting. Timeline cutscenes are a separate
tool. 2D sprite frame animation also uses the Animator but with sprite keyframes.
Animator to the model and assign an Animator Controller; for a humanoid model,
set its rig to Humanoid so it has an Avatar (enables retargeting and IK).Float (Speed), Bool (IsGrounded), Int,
Trigger (Jump) — and states with transitions whose conditions read those parameters.SetFloat, SetBool,
SetInteger, SetTrigger. The state machine resolves transitions for you.Float like Speed drives idle↔walk↔run)
instead of many discrete states + transitions.layerWeight.using UnityEngine;
[RequireComponent(typeof(Animator))]
public class CharacterAnim : MonoBehaviour
{
private Animator _anim;
// Cache parameter hashes — faster and typo-proof vs string lookups every frame.
private static readonly int Speed = Animator.StringToHash("Speed");
private static readonly int IsGrounded= Animator.StringToHash("IsGrounded");
private static readonly int Jump = Animator.StringToHash("Jump");
private void Awake() => _anim = GetComponent<Animator>();
public void Tick(float planarSpeed, bool grounded)
{
_anim.SetFloat(Speed, planarSpeed); // drives a 1D blend tree (idle/walk/run)
_anim.SetBool(IsGrounded, grounded); // gates a falling/landing transition
}
public void DoJump() => _anim.SetTrigger(Jump); // fire-and-forget; auto-resets after use
}
// dampTime smooths Speed so the blend tree doesn't snap; great for analog sticks.
_anim.SetFloat(Speed, targetSpeed, 0.1f /* dampTime */, Time.deltaTime);
// Useful for hit reactions where you want an immediate, explicit transition.
_anim.CrossFade("Hit", 0.1f); // blend over 0.1s normalized
// Or jump instantly: _anim.Play("Hit");
private System.Collections.IEnumerator AfterAttack()
{
var info = _anim.GetCurrentAnimatorStateInfo(0); // layer 0
yield return new WaitForSeconds(info.length); // approximate clip length
// ...follow-up logic
}
SetTrigger missed or "sticks" — triggers are consumed by the next satisfied transition
and auto-reset; if no transition consumes it, it can fire later unexpectedly. Use
ResetTrigger to clear, or prefer a Bool when the condition is a sustained state.Animator.StringToHash and cache the int hashes.Has Exit Time makes the transition wait for the clip to reach
a normalized time. Uncheck it for responsive, condition-driven transitions (jump, hit).Apply Root Motion is on but your code also moves the
transform (or vice versa). Decide: root motion or scripted movement, not both.layerWeight (0–1).OnAnimatorIK, requires "IK Pass" enabled on
the layer, and needs a Humanoid Avatar.OnAnimatorIK, SetIKPositionWeight, SetIKPosition, look-at), read
references/blend-trees-and-ik.md.ScriptReference/Animator.unity-csharp-scripting — the MonoBehaviour and coroutine timing used above.unity-physics — moving the body that the animation visualises.game-ai — deciding when to play which animation state.