GameDev

Aprendendo a programar jogos em Unity: introdução às animações para modelos humanoides 3D

Realizaremos os primeiros experimentos envolvendo a aplicação de animações aos objetos de nossos personagens no Unity.

em 01/09/2024
Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Dando sequência ao processo de desenvolvimento do game Consultório do Dr. Tratanildo, iremos experimentar pela primeira vez a aplicação de animações a objetos tridimensionais que representam personagens no cenário, como é o caso dos GameObjects dos pacientes e do excêntrico médico que empresta seu nome ao game.


Caso esta seja a primeira vez que você acessa nossa série, sinta-se especialmente convidado a iniciar sua participação conosco em um divertido processo de aprendizado no mundo do desenvolvimento de jogos. Por meio da elaboração de diferentes projetos, aprenderemos muito sobre como a ferramenta Unity pode nos auxiliar no processo de construção de games dos mais variados estilos.

A partir do primeiro tópico da série, mesmo quem nunca teve contato com conceitos de programação de jogos poderá aprender a tirar do papel as aventuras que sempre sonhou em tornar realidade. Abordamos desde os tópicos mais básicos, que envolvem a instalação e a configuração da ferramenta em nossos computadores, até os passos que irão nos levar, de fato, a elaborar únicos e divertidos desafios, como por exemplo o processo de criação de cenas, de configuração dos elementos interativos e de codificação de scripts.

Venha conosco nesta caminhada rumo a novos conhecimentos!

Relembrando animações

Em nosso encontro anterior, inserimos o modelo inicial que irá representar os pacientes em nosso game, verificando, dentre outras características, as diferentes faces e vestimentas que cada personagem poderá apresentar, por meio da troca dinâmica dos materials atrelados às diferentes partes que compõem o boneco (Arms, Bodies, Head e Legs).

Hoje iremos aprender na prática que, à parte dos elementos visíveis de um modelo tridimensional, outros elementos que fazem parte do GameObject de um personagem podem ser manipulados para conceder mais “vida” e movimentos ao objeto, por meio da aplicação de conceitos do sistema de animação do Unity.

Quem já nos acompanha desde os projetos anteriores talvez se lembre de quando, durante o processo de desenvolvimento de Motorista da Pesada, configuramos animações para as bombinhas (baseadas em troca de sprites) e para os itens coletáveis (baseadas em modificações dos valores dos parâmetros de rotação de seus respectivos componentes Transform) das cenas de jogo. 

Para quem quiser rememorar os conceitos envolvidos, vale muito a pena ler os conteúdos de nossos 22º e 23º encontros. 

O que iremos realizar nos experimentos de hoje é bem semelhante ao feito anteriormente, porém com adequações voltadas ao processo de aplicação de animações a personagens tridimensionais.

Para tanto, iremos abrir o Unity Hub e clicar 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.

Por enquanto, iremos iniciar as observações do comportamento das animações por meio da inserção de alguns elementos ao objeto paciente_base.

Animação esquelética

Uma das formas mais utilizadas em programação de jogos tridimensionais para se animar objetos tridimensionais, especialmente no caso de animação para modelos humanoides, é por meio da aplicação da técnica de animação esquelética, também conhecida pelo termo em inglês rigging.

Primeiramente, é importante realizarmos a definição de alguns termos importantes. Um modelo humanoide é um modelo que apresenta características semelhantes às de um humano no que se refere à estrutura básica de seu “corpo”.

Modelos que apresentam, por exemplo, braços, pernas, tronco e cabeça em suas composições são considerados humanoides, mesmo se não apresentarem semelhanças cosméticas com nossa espécie. Robôs, ETs e até mesmo alguns animais podem ser classificados nessa categoria.


Considerando o fato de que podemos ter uma variedade grande de personagens com diferentes feições externas, mas que, ao mesmo tempo, compartilham características estruturais semelhantes, seria muito interessante utilizarmos uma técnica de animação que realize modificações nos parâmetros de posicionamento e rotação dessas estruturas (como braços e pernas) para poder conceder aos personagens animações que são comuns a todos os seres humanoides sem grandes retrabalhos, como é o caso, por exemplo, do movimento das pernas ao caminhar ou o movimento realizado com os braços ao se dar um “tchauzinho” com as mãos.

Pensando nisso, no ano de 1988, três pesquisadores da Universidade de Montreal (Canadá) propuseram uma técnica que posteriormente seria popularizada pelo nome de "rigging”. Resumidamente, a técnica envolve o armazenamento, no arquivo de um modelo tridimensional, de uma árvore hierárquica de coordenadas tridimensionais (X, Y e Z) que representam a posição de cada parte do esqueleto (rig) de um modelo humanoide.


Essa técnica foi amplamente aceita pela emergente indústria da animação, e até hoje se utiliza o processo de rigging no desenvolvimento de jogos, filmes de animação, dentre outras obras multimídia.

Convencionou-se com o tempo que, ao utilizarmos um modelo 3D que receberá uma animação, sua “pose neutra” inicial será representada por aquela em que o modelo esteja com seus braços esticados para os lados e suas pernas bem retas e juntas, formando um “T” com seu corpo:

Embora nem todo modelo humanoide seja apresentado exatamente dessa forma (como podemos notar pela pose padrão dos modelos do paciente e do doutor), normalmente é o que encontramos ao trabalhar com esse tipo de personagem em cena.

Mão na massa

Voltando ao nosso caso concreto, iremos utilizar a técnica de animação esquelética para concedermos movimentações e ações dinâmicas tanto ao GameObject que representa o médico quanto aos objetos que representarão os pacientes. Para isso, vamos utilizar como base arquivos contendo algumas animações pré-elaboradas que representam diferentes comportamentos comuns, como caminhar e acenar as mãos.

Na aba Hierarchy, selecione o GameObject paciente_base. Clique sobre a seta ao lado de seu objeto subordinado Rig1 e note a presença de diversos outros objetos que, hierarquicamente organizados, são os responsáveis pelo armazenamento das coordenadas de cada parte do corpo do boneco.

Note que, ao clicarmos novamente sobre paciente_base, na aba Inspector já há a presença de um componente do tipo Animator. Então, que tal experimentarmos uma das animações que temos à disposição para vermos como o objeto irá se comportar em determinadas ocasiões em nossa aventura?

Na aba Project, vamos abrir as pastas Assets, Multimedia, 3D e, por fim, Animacoes. É nessa pasta que estamos armazenando os diferentes arquivos que contêm as animações propriamente ditas a serem aplicadas sobre nossos personagens.

Clique com o botão direito sobre uma área vazia da pasta e, no menu suspenso, selecione Create e, em seguida, Animator Controller.

Dê o nome de animControllerPacienteBase ao novo item criado, conforme exemplificado pela imagem a seguir:

Clique duas vezes sobre animControllerPacienteBase. Será exibida ao centro da janela do Unity o conteúdo da aba Animator. Na aba Project, clique e arraste o item de nome animTchau para alguma área vazia da janela da aba Animator. Uma pequena caixa laranja será exibida:

Como trata-se da primeira animação inserida no fluxo de animações do Animator Controller que criamos, o Unity já criou a primeira ligação entre o estado inicial do objeto (Entry) e a animação de fato (mixamo_com), representada pela seta em destaque na imagem a seguir.


O nome “mixamo_com” deriva do fato de que as animações que estamos utilizando foram baixadas do site Mixamo, da empresa Adobe, e foram criadas pelos autores com esse nome.

Como temos várias animações que vieram do mesmo site, ao inserirmos as animações nas telas de fluxo de animação iremos criar o hábito de renomeá-las para não nos confundirmos posteriormente. Clique sobre a caixa laranja e, na aba Inspector, altere o conteúdo da caixa de texto de nome (presente no canto superior da aba) para “dandoTchau”, sem as aspas.

Agora, vamos voltar à aba Scene para reposicionarmos o objeto de nosso paciente na cena, a fim de visualizarmos melhor a animação que iremos aplicar ao GameObject.

Na aba Hierarchy, selecione novamente paciente_base. Na aba Inspector, troque o valor do parâmetro Controller de seu componente Animator para o Animator Controller que criamos há pouco (animControllerPacienteBase). Altere, também, os valores dos parâmetros Position X Z de seu componente Transform para 8 e -15, respectivamente:

Vamos experimentar a execução do jogo e ver como está a animação de nosso personagem, indo à aba Game e pressionando o ícone do botão Play:

Veja que interessante: nosso paciente realiza a ação de acenar para a câmera, nos dando um “tchauzinho” com sua mão, mas apenas uma vez. Que tal alterarmos esse comportamento, fazendo com que o paciente nos acene continuamente?

Interrompa a simulação, clicando novamente sobre o botão Play e retornando à aba Scene. Na aba Project, ainda com a pasta Animacoes em aberto, clique duas vezes novamente sobre o elemento de nome animControllerPacienteBase.

Na aba Animator, clique com o botão direito sobre o elemento dandoTchau e, no menu suspenso, selecione a opção Make Transition, conforme exemplo a seguir:

Após a última ação realizada, clique novamente (com o botão esquerdo desta vez) sobre o elemento dandoTchau. Veja que uma pequena setinha surge, logo abaixo da caixa laranja. 


Essa seta representa uma transição de estados; neste caso em específico, ao terminar a execução da animação dandoTchau, o Unity irá repetir a ação, executando novamente a mesma animação de forma contínua.

Volte à aba Game para simularmos a execução do jogo, clicando sobre o ícone do botão Play. Veja a diferença no comportamento do personagem:

Interrompa a simulação do jogo e volte à aba Scene. 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

Aprendemos hoje um pouco mais sobre o conceito de animação esquelética (rigging) e experimentamos uma das animações pré-elaboradas que utilizam esse conceito sobre o objeto que representa o paciente em nossa cena de jogo.

Em nossos próximos encontros, iremos continuar a desenvolver os elementos que compõem o Consultório do Dr. Tratanildo, já aplicando os conceitos que experimentamos em nossos últimos encontros, como a animação de modelos humanoides.

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

Revisão: Ives Boitano
Referências: Graphics Interface

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.