Quick answer: Your code set a parameter or called Play on an Animator that has no controller to run: the Controller field is empty, you grabbed the wrong Animator (often the empty one on the root instead of the model's), or the object is inactive. Assign the controller, use GetComponentInChildren<Animator>() when the model is a child, and check isActiveAndEnabled before driving it.
This warning repeats every frame you call SetFloat or SetBool, and nothing animates. The Animator component exists, which is what makes it confusing, but it is not running a controller at the moment you talk to it.
The exact warning
Animator is not playing an AnimatorController
UnityEngine.Animator:SetFloat (string,single)
Click it and look at the second line of the stack trace to find the script and line calling the Animator.
Cause 1: no controller assigned
Select the object and look at the Animator component's Controller field. If it says None, drag your Animator Controller asset in. This happens after importing a new model (Unity adds an empty Animator), after duplicating a character, or when a prefab variant overrides the field.
If you assign controllers at runtime, make sure the assignment happens before the first parameter call:
animator.runtimeAnimatorController = controllerForThisCharacter;
An Animator Override Controller with no base controller set produces the same warning.
Cause 2: you are talking to the wrong Animator
Imported models often end up with two Animators: an empty one on the root that you added, and the real one on the model child (or the reverse). GetComponent<Animator>() on the root returns the empty one.
void Awake()
{
animator = GetComponentInChildren<Animator>();
if (animator == null || animator.runtimeAnimatorController == null)
Debug.LogError($"{name}: no Animator with a controller found", this);
}
Better still, remove the duplicate component and assign the Animator through a serialized field so it is explicit.
Cause 3: the GameObject or Animator is not active
An Animator on an inactive GameObject, or a disabled Animator component, is not playing its controller. Pooled objects are the usual case: your spawn code sets parameters before calling SetActive(true). Activate first, then drive the Animator, or guard the call:
if (animator.isActiveAndEnabled) animator.SetFloat(Speed, speed);
While you are there: cache parameter IDs
Use Animator.StringToHash once instead of passing strings every frame. It is faster, and it makes typos visible in one place:
static readonly int Speed = Animator.StringToHash("Speed");
A misspelled parameter name produces a different warning, “Parameter does not exist”, covered in the related posts below.
Animation that silently stops in builds
A character that stops animating in a build usually logs this warning on the player's device and nowhere else. Bugnet's Unity SDK captures errors from the log stream with the last log lines, so warnings that precede a reported bug are visible in the report, and players can file the visual problem itself from the in-game widget with a screenshot.
Related problems
- How to Fix the Unity “Parameter does not exist” Animator Warning
- Fix: Unity Animation Not Playing in Animator
- Fix: Unity AnimatorOverrideController Not Working
Frequently asked questions
What does “Animator is not playing an AnimatorController” mean?
Code set a parameter or called Play on an Animator that has no controller running, because the Controller field is empty, it is the wrong Animator, or its GameObject is inactive.
How do I fix it when the model is a child object?
Get the Animator with GetComponentInChildren<Animator>(), or assign it in the Inspector, and remove any empty Animator on the root.
Why does the warning appear with object pooling?
Parameters are set before the pooled object is activated. Call SetActive(true) first, or check animator.isActiveAndEnabled.
GetComponent on the root, controller on the child: the most common way to get this warning.