Crie controladores de animação para seus personagens como se fosse um script, para que sejam simples o suficiente para serem reutilizados, suportados e depurados durante todo o ciclo de desenvolvimento.
Todas as capturas de tela abaixo são da animação do personagem Henry em Firewatch da Campo Santo.
As Blend Trees são ótimas para ocultar a complexidade. Uma Blend Tree não tem estado, pois não faz chamadas de volta para o código. Ele mescla os diferentes clipes com base nos parâmetros que você define.
A importância disso é que você pode iterar as Blend Trees sem se preocupar em quebrar o resto do jogo. Você pode ocultar uma rede complexa de estados e evitar bugs no futuro, pois não é possível vincular o comportamento à maioria das animações em uma Blend Tree.
É útil pensar nas camadas como uma classe em um script. Você deseja que tudo em uma camada tenha a mesma função lógica e comportamental. Isso ocorre porque cada camada individual controla quais outras camadas ela substitui - se afeta ou não determinados ossos, se essa camada é aditiva e assim por diante.
Padrões lógicos reutilizáveis em máquinas de estado e de subestado aceleram o desenvolvimento, facilitam a depuração e podem reduzir os bugs, além de permitir que várias pessoas criem conteúdo semelhante.
As seções a seguir apresentam padrões que são úteis para estruturar suas camadas.
Esse padrão facilita a depuração, pois você pode ver claramente as transições saindo e voltando para o estado vazio. Cada raio do hub deve redefinir qualquer estado em que tocar.
Os raios são candidatos sólidos para a fabricação de máquinas de substrato usando os seguintes padrões.
Ao agrupar os estados em um padrão de "introdução" - execução/loop - "outro", você pode anexar de forma limpa qualquer evento de animação ou comportamento de máquina de estado aos estados de introdução e outro. De forma semelhante a uma Blend Tree, você pode iterar e alterar os estados internos de execução/loop sem se preocupar em interromper o jogo.
Para animações que podem ser interrompidas, especialmente animações acionadas por entradas do jogador, divida o clipe em duas partes. Primeiro, mantenha uma seção crítica que contenha todas as alterações de estado, efeitos e danos que sempre devem ser executados até a conclusão. Em segundo lugar, crie uma animação de assentamento que pareça boa para que você volte ao modo inativo e que possa ser interrompida por novas entradas.
Depois que as animações se comportarem e aparecerem como desejado, você precisará alimentar o estado dos animadores com o estado do jogo. Consulte as seções a seguir para ver alguns pontos importantes a serem considerados.
Os comportamentos da máquina de estado são partes de código que você pode anexar a qualquer estado de animação. Use-os para vincular os comportamentos diretamente ao estado do próprio animador.
Evite escrever códigos complexos de jogabilidade dentro deles, pois pode ser difícil rastrear a origem das alterações no estado. Se estiver usando o comportamento da máquina de estado para conduzir o código de jogabilidade, aproveite um sistema de mensagens, converse com uma classe de gerenciador 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 em 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# quando apropriado. Em vez de gerenciar centenas ou milhares de transições ou conectar transições AnyState em todos os lugares, use Animator.Play ou Animator.CrossFade para criar dinamicamente transições diretas a partir do código. Se isso ainda não for controle suficiente para você, procure a API Playables do Unity para obter mais maneiras de animar usando código. Alguns exemplos podem ser encontrados aqui.
Os eventos de animação vinculam um momento específico do clipe de animação a uma mudança específica de estado no jogo. Eles podem ser usados para definir elementos como efeitos visuais e sonoros. No entanto, se você sair de um clipe antes de ele ser disparado, ele nunca será disparado. Uma maneira de resolver isso é adicionar um comportamento de máquina de estado que garanta que o evento sempre seja acionado quando um ponto específico no tempo for atingido, independentemente do que mais acontecer (ou não acontecer) no jogo.