Transparency

"The man who chases two rabbits, catches neither."

  • Confucius

Animator Controllers are both an animation system and a Finite State Machine system, but trying to do both at once prevents them from being truly effective at either one. They're intended to manage the core logic of your character actions but they don't allow you to view any of their internal logic, making it unnecessarily difficult to understand or debug them. Unity's laughable idea of "Effective Debugging" is to record everything then play it back and hope you can spot the problem.

Animancer is a dedicated animation system. It doesn't make you define its logic in a special way so that it can try to manage its own behaviour, it just waits for you to tell it exactly what you want to do. This means that even without the Animancer Pro source code, you can still properly debug your important logic because it's all defined in your own scripts.

State machines are a very common way to manage the behaviour of complex systems so Animancer does come with a Finite State Machine system, but it's entirely separate from the animation system. They work well together, but you can very easily modify it or use any other system you prefer. Since it's intended to manage important logic, the full source code of the Animancer.FSM system is included in both Animancer Lite and Animancer Pro.

Example

Compare the process of telling each system to enter a particular state:

Mecanim Animancer
animator.Play("State Name"); stateMachine.TrySetState(state);
Does nothing until the Animator updates. Takes effect immediately.
If there is no state with that name it logs a warning, but gives no indication in the code. You already have the state so you can make sure it's not null beforehand.
If you have already called Play this frame, it will ignore other calls without giving any indication of that fact. If that State Change is not allowed, the TrySetState method returns false.
If you want to know why it's doing something, you basically just have to look around at everything that could possibly be causing it. If you want to know why it's doing something, you can use Debuggers and Logging since you have the source code.