
Dicas para construir controladores de animador no Unity
Crie controladores de animador para seus personagens como você faria com um script – para que sejam simples o suficiente para reutilizar, suportar e depurar ao longo do ciclo de desenvolvimento.
Todas as capturas de tela abaixo vêm da animação do personagem Henry em Firewatch da Campo Santo.

Oculte a complexidade em Árvores de Mistura
As Árvores de Mistura são ótimas para ocultar complexidade. Uma Árvore de Mistura não tem estado, pois não chama de volta para o código. Ela mistura entre os diferentes clipes com base nos parâmetros que você define.
A importância disso é que você pode iterar em Árvores de Mistura sem se preocupar em quebrar o resto do seu jogo. Você pode ocultar uma teia complexa de estados e evitar bugs no futuro porque não pode vincular o comportamento à maioria das animações em uma Árvore de Mistura.

Pense em camadas como uma classe de script
Ajuda pensar em camadas como uma classe em um script. Você quer que tudo em uma camada sirva tanto à mesma função lógica quanto comportamental. Isso ocorre porque cada camada individual controla quais outras camadas ela substitui - se afeta ou não certos ossos, se essa camada é aditiva, e assim por diante.
Reutilize padrões
Padrões lógicos e reutilizáveis em máquinas de estado e subestado aceleram o desenvolvimento, facilitam a depuração e podem reduzir bugs, tudo isso permitindo que várias pessoas criem conteúdo semelhante.
As seções a seguir apresentam padrões que são úteis para estruturar suas camadas.

Hub e spoke
Esse padrão facilita a depuração, pois você pode ver claramente as transições saindo e voltando para o estado vazio. Cada spoke do hub deve redefinir qualquer estado que tocar.
Spokes são candidatos sólidos para criar máquinas de subestado usando os seguintes padrões.

Padrão de entrada compartilhada/saída compartilhada
Agrupando estados em um padrão de "intro" - execução/loop - "outro", você pode anexar de forma limpa quaisquer Eventos de Animação ou Comportamentos de Máquina de Estado aos estados de intro e outro. Assim como uma Árvore de Mistura, você pode iterar e mudar os estados internos de execução/loop sem se preocupar em quebrar seu jogo.

Padrão de seção crítica e estabilização
Para animações interrompíveis, especialmente animações impulsionadas por entrada do jogador, divida seu clipe em duas partes. Primeiro, mantenha uma seção crítica que contenha todas as mudanças de estado, efeitos e danos que devem sempre ser executados até a conclusão. Em segundo lugar, crie uma animação de settle que pareça boa ao voltar ao estado ocioso e que possa ser interrompida por novas entradas.
Uma vez que suas animações se comportem e apareçam como desejado, você precisa retroalimentar o estado de seus animadores no estado do seu jogo. Veja as seções a seguir para alguns pontos-chave a serem lembrados.
Não escreva código complexo dentro dos Comportamentos da Máquina de Estados
Comportamentos de Máquina de Estado são trechos de código que você pode anexar a qualquer Estado de Animação. Use-os para vincular comportamentos diretamente ao estado do animador em si.
Evite escrever código de jogabilidade complexo dentro deles, pois pode ser difícil rastrear de onde estão vindo suas mudanças de estado. Se você estiver usando Comportamento de Máquina de Estado para conduzir código de jogabilidade, aproveite um sistema de mensagens; converse com uma classe gerenciadora ou acione seu código a partir de parâmetros em um nível mais alto.
Debug.Break() é um dos comportamentos de máquina de estado mais eficazes que você pode usar. Anexe-o em qualquer lugar na sua configuração de animação e você terá um ponto de interrupção semelhante ao de um sistema de script visual.
Use código C# onde apropriado. Em vez de gerenciar centenas ou milhares de transições, ou conectar transições de AnyState por toda parte, use Animator.Play ou Animator.CrossFade para criar transições diretas dinamicamente a partir do código. Se isso ainda não for controle suficiente para você, veja a API Playables do Unity para mais maneiras de animar usando código. Alguns exemplos podem ser encontrados aqui.

Use Comportamentos da Máquina de Estados para garantir que os Eventos de Animação sempre sejam acionados
Eventos de Animação vinculam um momento específico do seu Clip de Animação a uma mudança específica de estado no seu jogo. Eles podem ser usados para acionar elementos como efeitos visuais e sonoros. No entanto, se você transitar para fora de um clip antes que ele seja acionado, então ele nunca será acionado. Uma maneira de resolver isso é adicionar um Comportamento de Máquina de Estado que garante que o evento sempre seja acionado quando um ponto específico no tempo for alcançado, não importa o que mais aconteça (ou não aconteça) no jogo.