GameDev

Aprendendo a programar jogos em Unity: implementando melhorias nos fluxos de transição entre animações

Daremos prosseguimento aos experimentos com parâmetros, fluxos de transição e definição de estados-padrão no Unity.

em 22/09/2024
Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Após realizarmos, em nosso encontro anterior, interessantes experimentos envolvendo a inserção de parâmetros controladores da execução de animações para Animator Controllers, iremos interagir hoje com diferentes aspectos presentes nos fluxos de transição entre estados que podem ser importantes para corrigir comportamentos indesejados observados na movimentação dos personagens de Consultório do Dr. Tratanildo.



Caso esta seja a primeira vez que você acessa nossa série, não se assuste. Apesar do assunto poder parecer à primeira vista complexo demais para ser entendido, sobretudo para quem nunca teve contato com o mundo do desenvolvimento de jogos, conosco você poderá descobrir, passo a passo, que a criação de jogos pode ser uma atividade muito prazerosa e acessível.

A partir do primeiro texto da série, abordamos de forma prática diferentes tópicos que nos mostram como a ferramenta Unity pode nos auxiliar no processo de elaboração de jogos dos mais variados estilos. Aprenderemos juntos desde conceitos mais simples, como a instalação e a configuração da ferramenta em nossos computadores, até aqueles mais desafiadores, 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.

Permita-se e venha conosco nesta caminhada rumo a novos conhecimentos!

O mistério da caixa laranja

Uma das questões que levantamos anteriormente em relação aos estados de animação presentes em um Animator Controller é sobre a presença constante de um estado representado no fluxo por uma caixa de cor laranja. No caso concreto do controlador animControllerCaminhando01, trata-se do estado caminhandoState, que representa a primeira animação que inserimos no fluxo do referido controlador.

Embora à primeira vista possa parecer algo apenas cosmético, a representação de um dos estados de animação como uma caixa laranja indica que aquela animação será a primeira a ser executada no fluxo do Animator Controller em questão. Em outras palavras, significa que a animação representada ali é o estado-padrão definido para o controlador.

Se repararmos até o momento, ao realizarmos simulações de execução, o personagem representando o paciente sempre iniciou sua participação em cena e movimentando, mesmo ao mudarmos o valor do parameter Passo_caminhada para 0.08:

Talvez seja mais interessante para nós que o estado-padrão de animação a ser considerado no fluxo do Animator Controller seja paradoState, pois assim o personagem poderá iniciar seus movimentos apenas após estimularmos mudanças no valor de seu parâmetro controlador.

Vamos ver como podemos realizar essa alteração editando nosso projeto. Para isso, 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.

Na aba Project, abra as pastas Assets, Multimedia, 3D e, por fim, Animacoes. Clique duas vezes sobre o ícone do elemento animControllerCaminhando01 para concretizarmos a mudança do estado-padrão.

Com a janela da aba Animator em evidência na tela, clique com o botão direito sobre o item de nome Entry, representado por uma caixa verde. No menu suspenso que será apresentado, selecione a opção Set StateMachineDefault State, conforme exemplificado na imagem a seguir:

Agora, clique sobre a caixa que representa o estado de animação paradoState. Note que, a partir de Entry, há uma seta em direção a paradoState, que se tornou o estado-padrão do fluxo de animação, tomando a cor laranja de caminhandoState para si.

Altere o valor do parâmetro Passo_caminhada para 1e realize uma simulação de execução do jogo para ver o novo comportamento em ação:

Podemos notar que, agora, nosso paciente inicia a cena parado e, somente depois, entra em movimento. Teoricamente, o novo comportamento é o que desejávamos, porém podemos perceber que um novo desafio surgiu a partir da alteração realizada.

Transições imediatas

Por padrão, o Unity aguarda o término da execução de uma animação para verificar qual transição será realizada a partir dos valores dos parameters configurados no fluxo de um Animator Controller, conforme podemos visualizar ao selecionarmos o GameObject paciente_base via aba Hierarchy e clicarmos sobre a aba Animator durante uma execução de simulação:

Entretanto, é interessante que em determinadas situações haja uma transição imediata entre os estados, para evitar situações como a que presenciamos há pouco, em que o personagem fica “esperando” até tomar a atitude de iniciar sua movimentação, mesmo com o valor do parameter Passo_caminhada bem acima de 0.1.

Para que isso seja possível, após encerrar a simulação de execução do game (clicando novamente sobre o ícone do botão Play), volte à janela da aba Animator e selecione a seta que representa a transição paradoState caminhandoState. Note que, na aba Inspector, temos um atributo de nome Has Exit Time:

Esse atributo define se o Unity irá aguardar um tempo antes de finalizar a execução do estado corrente ou não. Vamos desativá-lo, conforme exemplo a seguir:

Faça o mesmo para a transição caminhandoStateparadoState, selecionando a seta que representa essa transição e removendo a seleção do atributo Has Exit Time, via aba Inspector:

Agora, que tal experimentarmos novamente a simulação da execução do game para vermos se, de fato, haverá a transição imediata entre os dois estados? Veja o resultado:

Como ajustamos o valor do atributo Has Exit Time para as duas transições, veja que interessante é o comportamento dos estados ao se alterar dinamicamente o valor do parâmetro Passo_caminhada durante a simulação da execução:

Encerre a simulação da execução e retorne à aba Animator para realizarmos os últimos ajustes de nosso encontro de hoje:

Ajustes no tempo de transição

Para entendermos as alterações que realizaremos agora, primeiramente vamos alterar o valor do parâmetro Passo_caminhada para 5 e iniciar uma nova simulação de execução:

Podemos tirar duas conclusões interessantes do comportamento observado:
  • As alterações que realizamos para transição imediata entre estados funcionou adequadamente, pois o personagem não iniciou sua trajetória em cena parado;
  • Algo de estranho está ocorrendo com nosso paciente, que parece estar “mancando” entre os ciclos de execução da animação de caminhada.
Esse comportamento estranho também tem relação com propriedades de transições entre estados de animação, mais especificamente em relação à transição entre o estado caminhandoState e ele mesmo, representada por um pequeno triângulo, em destaque na imagem a seguir: 

Clique sobre o referido triângulo e, em seguida, na aba Inspector clique sobre a propriedade Settings, caso seus atributos ainda não estejam sendo exibidos detalhadamente, como exemplificado a seguir:

Note a presença da propriedade Fixed Duration. Ela é responsável por ditar ao Unity se a transição entre estados será realizada em uma quantidade fixa de segundos (determinada por Transition Duration (s)) ou por meio de uma percentagem do tempo de execução atual.

Como Fixed Duration está selecionada no momento (valor verdadeiro) e realizamos há pouco uma alteração na velocidade da execução de caminhandoState por meio de alteração no valor do parameter Passo_caminhada, há um descompasso entre a rapidez da animação (dinâmica) e o tempo gasto na transição (estática).

Para corrigirmos essa situação, basta deixarmos em branco a caixa de seleção de Fixed Duration (valor falso). Note que, ao realizarmos essa ação, a propriedade Transition Duration (s) transforma-se em Transition Duration (%), permitindo que a transição ocorra em tempo dinâmico, levando em conta a duração real da execução do estado de animação corrente.


Feito isso, vamos realizar novamente uma simulação de execução. Note a clara diferença:

Agora, o boneco que representa o paciente apresenta uma transição bem mais fluida, sem parecer que está mancando. Curiosamente, ao mudarmos a visualização para a aba Scene com a simulação da execução em andamento, dá para perceber que nosso personagem ainda está viajando “ao infinito e além”, o que iremos corrigir em breve.

Interrompa a simulação da execução, clicando novamente sobre o ícone do botão Play. 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

Após realizarmos diferentes experimentos em nossos últimos encontros, pudemos aprender na prática um pouco mais sobre as diferentes possibilidades que um Animator Controller nos proporciona para a gestão de animações de modelos humanoides no Unity.

Nos próximos tópicos, daremos sequência ao processo de montagem e configuração dos elementos que farão parte desta louca aventura ambientada em um dos mais exóticos consultórios do mundo virtual.

Nosso próximo encontro será no próximo dia 29 de setembro. Até mais! Fique sempre ligado nas novidades do GameBlast!

Revisão: Ives Boitano

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.