Aprendendo a programar jogos em Unity: interferindo nas transições de estado entre animações

Por meio de ajustes nos parâmetros do controlador, iremos conhecer formas de alternar entre animações no Unity.

em 15/09/2024
Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Prosseguindo com os experimentos práticos de aplicação de animações aos personagens de Consultório do Dr. Tratanildo, hoje iremos descobrir formas interessantes de condicionar a execução de determinadas animações a partir da configuração de parâmetros controladores do fluxo de estados de um Animator Controller.

Caso esta seja a primeira vez que você acessa nossa série, sinta-se à vontade para juntar-se a nós em um divertido processo de aprendizagem. A partir do primeiro texto da série, iremos aprender de forma prática diferentes conceitos sobre como a ferramenta Unity pode nos auxiliar a elaborar jogos dos mais diferentes estilos de gameplay.


Mesmo que você não tenha experiências prévias em desenvolvimento de games, não se acanhe: no início da série, abordamos desde os tópicos mais básicos, como as etapas de instalação e configuração da ferramenta em nossos computadores, até etapas mais concretas do processo de criação de um jogo, como a elaboração de cenas, a inserção de elementos multimídia (como imagens e sons) e a codificação dos scripts que controlam os comportamentos e regras de uma aventura virtual.

Venha conosco nesta caminhada rumo a novos conhecimentos!

Transições de estado e parameters

Após as experimentações realizadas em nosso encontro anterior, duas questões vieram à tona a partir da observação dos comportamentos apresentados pelos personagens nas simulações de execução realizadas:
  • Existe alguma forma de interferirmos nas transições de estado presentes em um Animator Controller?
  • Qual a diferença entre animações representadas por caixinhas laranjas e por caixinhas cinzas no fluxo de animação?
Hoje, iremos responder na prática à primeira das duas perguntas, e já adianto: sim, é possível realizarmos intervenções nos fluxos de estados (animações) de um Animator Controller de diferentes formas.

Uma das formas mais diretas e simples de se realizar esse tipo de intervenção é por meio da implementação de parameters (parâmetros), uma funcionalidade que o Unity apresenta dentro da estrutura dos Animator Controllers para que possamos indicar ao game a existência de variáveis específicas cujos valores podem determinar qual transição será aplicada a partir do término da execução de um determinado estado.

Que tal colocarmos em prática essa possibilidade, adicionando e configurando parameters em um de nossos controladores? Vamos então iniciar os experimentos de hoje; abra o Unity Hub e clique duas vezes sobre o item referente ao projeto Consultório do Dr. Tratanildo. Na interface inicial do Unity, na aba Project, abra a pasta Assets, Scenes e, por fim, clique duas vezes no ícone da cena ConsultorioScene. Certifique-se de estar com a visualização da aba Scene em evidência na tela.

Na aba Project, abra as pastas Assets, Multimedia, 3D e, por fim, Animacoes. Clique duas vezes sobre o ícone do elemento animControllerCaminhando01, conforme ilustrado na imagem a seguir:

A janela da aba Animator estará em evidência na tela, contendo o fluxo de estados (animações) que delineamos anteriormente. Note que, no canto superior esquerdo da janela de Animator, existe um botão de nome Parameters. Clique sobre o botão para iniciarmos a inserção de parâmetros em nosso fluxo.

O primeiro parâmetro que iremos configurar terá relação com a velocidade da caminhada ao se executar a animação desse tipo de interação. Será um parâmetro numérico, do tipo float, que terá dois papeis bem definidos:
  • Determinar a velocidade do deslocamento do personagem que receberá a animação de caminhada;
  • Possibilitar ao jogo alternar entre as animações caminhandoState e paradoState, dependendo de seu valor.
Para criar o referido parameter, clique sobre o botão “+” (em destaque na imagem a seguir), selecione o tipo Float e, por fim, conceda o nome “Passo_caminhada”, sem as aspas, para o novo parâmetro criado:

Note que, ao lado de Passo_caminhada, temos disponível uma caixa de texto que poderemos utilizar para alterar o valor padrão do parameter.


Agora, vamos criar transições de estado adicionais entre caminhandoState e paradoState para que possamos usar o novo parâmetro como fator de transição entre os dois estados. Para isso, clique com o botão direito sobre caminhandoState e selecione a opção Make Transition.

Após a última ação, clique novamente sobre caminhandoState, mas desta vez com o botão esquerdo do mouse. Um pequeno triângulo será apresentado, indicando a criação de uma transição de repetição entre um estado e ele mesmo. Por fim, crie mais uma transição, desta vez partindo de paradoState em direção a caminhandoState.

Ao final, teremos duas linhas indicando transições entre estados (destacadas em azul na imagem a seguir), além de dois “triângulos” que representam as transições de repetição (destacados em vermelho):

Configurando conditions

Clique sobre a seta que parte de caminhandoState em direção a paradoState. Note que ela será exibida em tela na cor azul claro, além de serem exibidas algumas informações sobre a transição na aba Inspector.

No final dos elementos presentes em Inspector, temos presente uma seção de nome Conditions. Nessa seção, poderemos configurar quais parâmetros irão ativar a transição em questão.


Clique sobre o botão “+” da seção Conditions (em destaque, na imagem a seguir). Serão apresentadas em tela três caixas de inserção de textos: na primeira, clique e selecione o item Passo_caminhada; no segundo, selecione a opção Less e, na terceira, insira o valor 0.1, conforme a imagem a seguir:


Com essas ações, determinamos a condição que permitirá a execução da transição entre estados: somente se o valor armazenado pelo parâmetro Passo_caminhada for menor do que 0.1 sairemos da execução de caminhandoState para paradoState.

Como temos duas transições com ponto de origem em caminhandoState (caminhandoState  → paradoState, caminhandoState caminhandoState), precisamos ainda indicar ao Unity qual a ordem de prioridade entre as transições, para que, caso uma transição não seja executada, o jogo saiba o que deve de fato fazer.

Para isso, clique sobre a caixinha laranja caminhandoState e, na aba Inspector, certifique-se de que, na seção Transitions, a transição caminhandoState paradoState esteja em primeiro lugar na lista; caso não esteja, clique e arraste para cima o símbolo do lado esquerdo do elemento (destacado em azul na imagem a seguir):


Vamos realizar também as configurações referentes à transição entre paradoState e caminhandoState. Clique sobre a seta que representa essa transição e, na seção Conditions da aba Inspector, defina a seguinte regra:
  • 1º campo (parameter): Passo_caminhada;
  • 2º campo (comparação): Greater;
  • 3º campo (valor): 0.1.
A regra será bem semelhante ao que fizemos anteriormente: somente haverá transição de paradoState para caminhandoState se o valor de Passo_caminhada for maior do que 0.1.

Indique a ordem de preferência da execução de transições também para paradoState, clicando sobre sua caixinha e, na aba Inspector, rearranjando o elemento paradoState caminhandoState acima de paradoStateparadoState.

Por fim, para atender à segunda característica de Passo_caminhada (controlar a velocidade da caminhada do personagem), vamos selecionar a caixinha laranja de caminhando_state e, na aba Inspector, deixar marcada a opção Parameter do lado direito de Multiplier, logo abaixo de Speed.

A caixa de seleção (destacada em verde na imagem anterior) será habilitada, permitindo selecionarmos a opção Passo_caminhada.


Dessa forma, dependendo do valor concedido ao parameter Passo_caminhada, a velocidade da caminhada do personagem também será afetada.

Primeiros experimentos

Vamos realizar alguns ajustes na cena para que possamos visualizar melhor a influência das alterações que realizamos no encontro de hoje. Volte à aba Scene e, na aba Hierarchy, selecione Main Camera, subordinado a Cameras. Na aba Inspector, modifique os valores do parâmetro Position de seu elemento Transform, conforme descrito a seguir:
  • Position X = -7;
  • Position Y = 5;
  • Position Z = 6.

Volte à aba Animator e, na extremidade esquerda da janela, modifique o valor destinado ao parameter Passo_caminhada para 0.5:

Agora, experimente simular a execução do game, indo à aba Game e pressionando o botão Play:

Note que de fato houve uma redução significativa na velocidade de deslocamento do personagem que representa o paciente na cena. Posteriormente, iremos modificar dinamicamente via scripts o valor desse parameter, permitindo o controle adequado do deslocamento dos personagens dentro do consultório.

Pare a simulação da execução e experimente agora alterar o valor de Passo_caminhada para 0.08 e iniciar nova simulação. Observe o interessante comportamento do personagem:

Além da maior redução na velocidade, em determinado momento há a transição entre estados desejada: o personagem para de andar e permanece imóvel no cenário depois de terminada a execução da animação de caminhada.

Interrompa novamente a simulação da execução. Não se esqueça de salvar a cena (menu File, opção Save) e o projeto (menu File, opção Save Project) antes de fechar o editor.

Próximos passos

Em nosso próximo encontro, daremos prosseguimento aos experimentos, observando alguns comportamentos de transição de estados e realizando ajustes bem-vindos para que possamos controlar posteriormente as animações de nossos personagens da melhor forma, além de responder à tão esperada segunda pergunta levantada ao término do encontro anterior.

Nosso próximo texto já encontra-se disponível, continue conosco nessa jornada de conhecimento e fique ligado sempre aqui no GameBlast!

Revisão: Davi Sousa

Entendo videogames como sendo uma expressão de arte e lazer e, também, como uma impactante ferramenta de educação. No momento, doutorando em Sistemas da Informação pela EACH-USP, desenvolvendo jogos e sistemas desde 2020. Se quiser bater um papo comigo, nas redes sociais procure por @RodrigoGPontes.
Este texto não representa a opinião do GameBlast. Somos uma comunidade de gamers aberta às visões e experiências de cada autor. Escrevemos sob a licença Creative Commons BY-SA 3.0 - você pode usar e compartilhar este conteúdo desde que credite o autor e veículo original.