Caso esteja lendo pela primeira vez textos de nossa série, sinta-se especialmente convidado a juntar-se a nós em uma divertida trilha de aprendizagem. Desenvolvendo projetos práticos de codificação de jogos, conheceremos mais sobre as características da ferramenta Unity, aprendendo a utilizá-la para, enfim, tirarmos do papel os games que sempre sonhamos em tornar realidade.
A partir do primeiro tópico, aprenderemos sobre diferentes etapas do processo de criação de um game, desde a instalação e configuração da ferramenta em nossos computadores até a composição, de fato, das fases e desafios do jogo, passando pela composição do layout dos elementos multimídia de uma cena, pela programação dos scripts que controlam as regras do game e os comportamentos de seus elementos, e por diversos outros aspectos interessantes.
No momento, estamos desenvolvendo o game Consultório do Dr. Tratanildo: trata-se de um game que mistura características de platformers tridimensionais com puzzles clássicos dos anos 1980 e 1990, tais como Dr. Mario (Nintendo, 1990) e Pac-Man (Namco, 1980).
Aproveite esta oportunidade e venha conosco para que possamos seguir juntos nesta trilha de novos conhecimentos e muita diversão!
Animação do paciente
Desde a construção inicial do cenário de Consultório do Dr. Tratanildo, ao adicionarmos os modelos tridimensionais do doutor e do paciente, realizamos constantemente ajustes em características que envolveram aspectos de animação dos personagens, permitindo, por exemplo, o controle livre do deslocamento de Tratanildo por seu consultório.
Embora já seja um avanço significativo, precisamos codificar também o comportamento de caminhada para o paciente, para permitir que, ao chegar ao consultório, desloque-se ao ponto que indicamos no encontro anterior, próximo ao médico, iniciando de fato sua interação com o dono do consultório e, por consequência, as atividades pertencentes a sua fase.
Para isso, precisaremos aplicar alterações ao controlador de animações atrelado ao GameObject do paciente, permitindo que ele se desloque automaticamente pelo cenário. Então, mãos à obra!
Iniciaremos as intervenções de hoje abrindo o projeto para edição. No Unity Hub, clique duas vezes sobre o item referente ao projeto Consultório do Dr. Tratanildo. Na interface inicial do editor, na aba Project, abra a pasta Assets, Scenes e, por fim, clique duas vezes no ícone da cena ConsultorioScene.
Na aba Hierarchy, selecione o objeto paciente_base, subordinado a Pacientes (que, por sua vez, encontra-se subordinado a Personagens). Na aba Inspector, dentro da seção reservada ao componente Animator, clique duas vezes sobre o valor atribuído ao elemento Controller. Note que, na aba Project, o Unity dará destaque ao controlador em questão, presente na pasta “Assets/Multimedia/3D/Animacoes”, conforme indicado em amarelo na ilustração a seguir:
Na aba Project, clique duas vezes sobre o ícone do elemento animControllerPacienteBase. Na aba Animator, note que, até o momento, o comportamento padrão do personagem restringia-se à execução cíclica da animação dandoTchau.
Como o primeiro comportamento do paciente em cena será seu deslocamento em direção ao médico, realizaremos modificações significativas nesse fluxo de animações.
Transições entre estados
Na aba Project, selecione o ícone que representa o elemento animParado, clique e arraste-o em direção à janela da aba Animator. Um novo retângulo cinza, de nome “mixamo_com”, aparecerá na tela.
Selecione mixamo_com e, na aba Inspector, renomeie-o para “estadoParado”, sem as aspas, conforme exemplificado a seguir:
Na aba Animator, clique com o botão direito sobre o retângulo verde de nome Entry e selecione a opção Set StateMachine Default State:
Em seguida, clique sobre estadoParado, tornando-o o estado inicial do fluxo de estados de animação, consequentemente interrompendo a transição inicial para dandoTchau, como acontecia anteriormente.
Feita a alteração, de volta à aba Project, iremos clicar e arrastar o ícone do elemento animCaminhando em direção à área da aba Animator. Um novo retângulo de nome “mixamo_com” surgirá na tela:
Renomeie-o para “estadoCaminhando”, sem as aspas, via aba Inspector, conforme ilustrado a seguir:
Nos próximos encontros, iremos configurar via script a transição entre as animações recém-introduzidas ao controlador. Essa transição será realizada por intermédio da alteração do valor de um parâmetro booleano a ser inserido agora.
Ainda na aba Animator, clique sobre a opção Parameters. Por enquanto, ainda não temos nenhum parâmetro adicionado ao controlador de animações que está sendo editado:
Próximo à opção Parameters, clique sobre o botão de acréscimo de parâmetros, representado pelo símbolo de mais (+). No menu suspenso apresentado, selecione a opção Bool:
Nomeie o novo parâmetro como “caminharPeloCenario”, conforme indicado pela ilustração a seguir.
Já com o novo parâmetro devidamente acrescido ao controlador de animações, é hora de introduzirmos as transições entre estadoParado e estadoCaminhando. Clique com o botão direito sobre estadoParado e selecione a opção Make Transition:
Logo em seguida, clique sobre estadoCaminhando, criando uma seta entre os dois estados, representando a primeira transição inserida entre os elementos. Selecione a transição, clicando sobre a seta, e, na aba Inspector, realize as seguintes intervenções sobre os atributos apresentados:
- Has Exit Time: deixe a caixa de seleção vazia;
- Settings > Interruption Source: altere o valor do atributo para Next State;
- Conditions: clique sobre o símbolo de mais (+) e, nos novos campos apresentados, indique o parâmetro caminharPeloCenario e a condição de valor true para realização da transição.
Repita a dose, criando dessa vez uma transição entre estadoCaminhando e estadoParado. Selecione-a, clicando sobre a nova seta que surgir entre os estados, e, na aba Inspector, serão estas as intervenções a serem realizadas:
- Has Exit Time: deixe a caixa de seleção vazia;
- Settings > Interruption Source: altere o valor do atributo para Next State;
- Conditions: clique sobre o símbolo de mais (+) e, nos novos campos apresentados, indique o parâmetro caminharPeloCenario e a condição de valor false para realização da transição.
Ainda na aba Animator, crie uma nova transição entre estadoCaminhando e ele mesmo, fazendo surgir um pequeno triângulo na extremidade inferior do estado. Selecione a transição e, via aba Inspector, realize apenas uma intervenção, trocando o valor de Interruption Source para Next State, conforme indicado no exemplo a seguir:
Por fim, criaremos a última transição de hoje, dessa vez entre estadoParado e ele mesmo. Selecione o pequeno triângulo que surgir abaixo do estado e, via aba Inspector, repita a última intervenção realizada também para essa transição (Interruption Source = Next State).
Antes de concluirmos as diversas modificações que realizamos hoje sobre animControllerPacienteBase, na lista de parâmetros do controlador de animações, clique sobre a caixa de seleção de caminharPeloCenario, deixando-a com valor verdadeiro (true) e possibilitando, assim, que possamos realizar alguns testes com o paciente no cenário
Experimentos e correções
Vamos experimentar a execução do game e observar o comportamento do GameObject pelo cenário do consultório, indo à aba Game e clicando sobre o ícone do botão Play:
Pois é, embora definitivamente possamos observar que houve a transição entre estadoParado e estadoCaminhando, o paciente não se desloca pelo consultório como esperávamos inicialmente. Teremos de investigar o que, de fato, está ocorrendo, analisando características dos componentes atrelados à paciente_base.
Interrompa a simulação, clicando novamente sobre o ícone do botão Play. Vamos retornar à visualização da aba Scene para analisarmos melhor o ocorrido.
Na aba Hierarchy, selecione paciente_base. Observe que, na aba Inspector, o atributo Apply Root Motion de seu componente Animator apresenta um valor não editável (Handled by Script).
Esse valor só é exibido quando algum script interage diretamente com aspectos de rotação e movimentação derivados da execução de uma animação, o que de fato ocorre no caso concreto de paciente_base por intermédio do componente Controller Mov_Tank atrelado a si.
No início do processo de codificação do script de controle de movimentação dos personagens, realizamos testes utilizando o avatar que representa o paciente. Embora desabilitado, o script está apto para, a qualquer momento, realizar alterações nas modificações de posição e rotação calculados por Animator.
Como não utilizaremos mais esse script junto aos pacientes, podemos removê-lo sem prejuízos. Clique com o botão direito sobre seu título e selecione a opção Remove Component.
Note que, agora, o atributo Apply Root Motion deixou de exibir seu antigo valor, permitindo a alteração via editor. Ativando-o, permitiremos que as rotações e movimentações da animação sejam aplicadas tanto à posição quanto à rotação locais do Transform de paciente_base. Portanto, deixe sua caixa de seleção marcada, conforme indicado no exemplo a seguir:
Agora sim, ao realizarmos nova simulação de execução do game, o moribundo paciente poderá se deslocar em direção a Doutor Tratanildo, posteriormente permitindo ao pobre enfermo suplicar ao nobre médico a realização de miraculosos tratamentos (à preços módicos, claro).
Interrompa a simulação, clicando novamente sobre o ícone do botão Play e voltando à 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
Continuamos a desenvolver as etapas iniciais das fases de nosso game, dessa vez configurando aspectos que envolvem a animação de caminhada do personagem em direção ao médico no consultório.
Nos próximos encontros, vamos realizar intervenções em códigos de scripts controladores da sequência inicial do game, visando concluir a construção da primeira interação entre paciente e médico.
Nos vemos, então, no próximo dia 13 de julho. Até mais! Fique sempre ligado nas novidades do GameBlast!
Revisão: Ives Boitano