Seja bem-vindo(a) ao
GameDev: Aprendendo a programar jogos em Unity de hoje! Como nem tudo são flores nessa vida, após concluirmos, em nosso
encontro anterior, o posicionamento e a configuração da versão festiva do modelo 3D de nosso querido médico em cena, é chegada a hora de realizarmos uma sequência de atividades semelhantes, porém destinada a permitir a exibição da versão tristonha de Doutor Tratanildo quando os jogadores não conseguirem cumprir os objetivos propostos pelo game a tempo.
Caso hoje seja a primeira vez que você lê um texto de nossa série, aproveite a oportunidade para juntar-se a nós em uma divertida caminhada de aprendizados sobre o universo do desenvolvimento de jogos.
Por meio do uso da plataforma Unity, estamos elaborando diferentes projetos práticos de programação que estão nos permitindo tirar do papel games dos mais variados estilos, tais como platformers e puzzles.
No momento, estamos trabalhando no projeto do jogo Consultório do Dr. Tratanildo: trata-se de um game ambientado em um consultório médico 3D cujas inspirações para a elaboração de seu gameplay prestam homenagens a diferentes jogos dos anos 1980 e 1990, tais como Dr. Mario (Nintendo, 1990), Pac-Man (Namco, 1980) e Tama (Time Warner Interactive, 1994).
Nossa série é desenvolvida para todas as pessoas que tenham a vontade de criar uma aventura digital do zero, mesmo aquelas que não tenham tido a oportunidade prévia de aprender conceitos técnicos sobre programação de jogos ou de sistemas.
A partir do
primeiro texto da série são abordados tópicos muito interessantes e importantes, tais como a instalação e a configuração da ferramenta Unity em nossos computadores, a organização interna dos elementos de um projeto Unity, a inserção e a configuração de elementos visuais multimídia (imagens, sons, textos, modelos 3D), e a codificação da lógica das regras e das interações entre objetos dentro do contexto de uma fase ou cena de jogo.
Não se acanhe e, a partir de agora, venha conosco para que possamos, juntos, seguir nesta trilha rumo a novos conhecimentos!
Uma triste derrota
Tão importante quanto a correta exibição da tela de vitórias é a composição adequada dos elementos da tela de Game Over de nossa aventura, e, de forma semelhante ao que elaboramos em nosso encontro anterior, vamos utilizar uma cópia do modelo tridimensional de Doutor Tratanildo para expressar o sentimento vivido no momento da derrota.
Como a composição do elemento em cena será bem parecida ao que já efetuamos para a versão feliz do famoso médico, vamos acabar reaproveitando algumas das customizações realizadas para o GameObject implementado anteriormente no novo objeto a ser inserido hoje.
Para tal, vamos abrir nosso 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 DoutorVitoria, subordinado ao GameObject Doutores que, por sua vez, encontra-se subordinado a Personagens. Clique com o botão direito sobre seu elemento e, no menu suspenso exibido, escolha a opção Duplicate.
Após a criação da cópia do referido objeto, clique com o botão direito sobre o novo elemento e selecione a opção Rename. Conceda-lhe o nome “DoutorDerrota”, volte a selecioná-lo e, na aba Inspector, ative o objeto e altere o valor do atributo Position Z para -10, conforme exemplificado pela imagem a seguir:
Nosso doutor tristonho ficará posicionado ao lado do espaço que designamos para DoutorVitoria, evitando o risco de acabarem se sobrepondo no mesmo ponto do cenário, embora iremos ativar apenas um modelo de cada vez, via código, dependendo da situação corrente do jogo no momento (vitória, derrota, em tratamento, etc.).
Como DoutorDerrota é uma cópia direta de DoutorVitoria, ele ainda apresenta atrelado a si o mesmo controlador de animações referente ao momento de vitória do game. Vamos, então, criar um controlador novo para configurarmos as “tristes animações” que o médico expressará no momento do Game Over.
Na aba Project, abra as pastas Assets, Multimedia, 3D e, por fim, Animacoes. Clique com o botão direito sobre uma área vazia da pasta e no menu suspenso, selecione as opções Create e, em seguida, Animator Controller.
Para o novo controlador criado, conceda o nome “animControllerDoutorTriste”. Clique duas vezes sobre seu ícone para abrir o fluxo de animações na aba Animator, conforme ilustrado a seguir:
O comportamento esperado para a versão de Doutor Tratanildo que estamos configurando hoje envolverá a repetição contínua das seguintes ações de forma sequencial:
- O médico inclinará a cabeça para trás e os braços para baixo, expressando frustração;
- O médico levará as mãos ao rosto e a balançará para os lados, como se estivesse chorando, demonstrando incredulidade.
As duas animações que comporão este comportamento estão armazenadas nos elementos de nome “animFrustrado” e “animDecepcao”, respectivamente, presentes dentro da pasta Animacoes.
Ainda com a pasta Animacoes em evidência na aba Project, clique e arraste o elemento animFrustrado em direção à tela de fluxo de animações da aba Animator. Um retângulo laranja de nome “mixamo_com” aparecerá na tela.
Em seguida, também na aba Project, clique e arraste o elemento animDecepcao em direção à tela de fluxo de animações da aba Animator. Outro retângulo de nome “mixamo_com”, desta vez na cor cinza, será acrescentado ao fluxo.
Como ambas as animações apresentaram o mesmo nome ao serem importadas para o fluxo de animações de animControllerDoutorTriste, vamos conceder nomes específicos para cada uma, a fim de se evitar confusões. Selecione o elemento na cor laranja e, na aba Inspector, altere seu nome para “Frustracao”, conforme indicado a seguir:
Repita a operação, desta vez para o elemento na cor cinza, concedendo-lhe o nome “Choro”.
Vamos, agora, realizar a ligação lógica entre as duas animações, para que haja a execução contínua das duas animações de forma sequencial. Clique com o botão direito sobre Frustracao e, no menu suspenso, selecione a opção Make Transition. Em seguida, clique sobre Choro.
Logo após, repita a operação, dessa vez partindo-se de Choro em direção a Frustracao. Teremos ao fim duas setas brancas que representam uma ligação cíclica entre as animações, conforme ilustrado a seguir:
Volte à visualização da aba Scene e, na aba Inspector, selecione novamente DoutorDerrota. Na aba Inspector, altere o valor do atributo Controller de seu componente Animator para o item que representa o controlador de animação recém-configurado (animControllerDoutorTriste).
Que tal darmos uma olhada em como a animação está ficando estruturada em cena? Para tal, clique sobre o ícone do botão Play e, em seguida, alterne a visualização da aba Game para a aba Scene. Ao chegarmos perto do personagem, poderemos notar como a animação ocorrerá:
Interrompa a simulação da execução para que possamos prosseguir com as configurações de nosso projeto.
Nova textura e uma intervenção em código
Vamos criar, agora, uma nova textura de renderização para que seja exibida a imagem do doutor tristonho na porção direita da tela de Game Over.
Na aba Project, abra as pastas Assets, Multimedia e, em seguida, TexturasCamera. Clique com o botão direito sobre uma área vazia da pasta e, no menu suspenso, selecione a opção Create e, em seguida, Render Texture. Conceda o nome “TexturaCameraDoutorTriste” ao novo elemento criado, assim como exemplificado pela imagem a seguir:
Selecione TexturaCameraDoutorTriste e, na aba Inspector, modifique suas dimensões (parâmetro Size) para 650 x 850.
Na aba
Hierarchy, selecione o
GameObject CameraVitoria, subordinado a
DoutorDerrota. Renomeie-o para “CameraDerrota”, sem as aspas, para que não realizemos confusão entre as câmeras a serem utilizadas nos dois momentos distintos.
Após a alteração do nome do objeto, selecione-o e, na aba Inspector, altere o valor do atributo Target Texture de seu componente Camera para o item que representa a nova textura criada (TexturaCameraDoutorTriste), conforme indicado a seguir:
Volte à aba Hierarchy para selecionarmos, agora, o objeto ImagemDoutorTriste, que encontra-se subordinado ao GameObject TelaGameOver. Modifique o valor do atributo Texture de seu componente Raw Image para TexturaCameraDoutorTriste. Dessa forma, criaremos o elo que liga a exibição da câmera que capta as imagens do médico entristecido com o elemento visual da tela subordinada ao Canvas da cena.
Selecione o objeto DoutorDerrota, via aba Hierarchy, e, na aba Inspector, desabilite-o. Iremos ativar sua exibição e comportamentos apenas ao se exibir a tela de derrota do jogo, o que será feito por meio da ação do script controlador das fases.
Para finalizarmos nossas interações com a aba Hierarchy (pelo menos por hoje), selecione o GameObject ControladorFase e, via aba Inspector, configure o valor do atributo Doutor Tristeza de seu componente Controller Fase para que represente o GameObject DoutorDerrota, assim como ilustrado a seguir:
Por fim, vamos realizar uma pequena alteração em um trecho de código do script ControllerFase, visando a correta ativação de DoutorDerrota ao se exibir a tela de Game Over de nossa aventura. Na aba Project, abra a pasta Assets e, em seguida, Scripts. Clique duas vezes sobre o ícone do referido script para editarmos seu conteúdo via Visual Studio:
Dentro da estrutura do método void Update(), insira uma linha imediatamente após a indicação no código do comando para ativação do GameObject telaDerrota (antes do fechamento das chaves) e introduza o seguinte trecho de código:
doutorTristeza.SetActive(true);
Dessa forma, garantiremos que, ao esgotar o tempo disponível para o tratamento do paciente, o modelo 3D de Doutor Tratanildo seja ativado conjuntamente à tela de derrota do game.
Salve o script e feche o Visual Studio. Retorne ao editor do Unity e experimente a execução de nosso jogo, indo à aba Game e pressionando o ícone do botão Play. Aguarde alguns segundos até que o tempo se esgote para ver em ação tudo o que preparamos no encontro de hoje:
Interrompa a simulação, clicando novamente sobre o ícone do botão Play e retornando à 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
Seja na alegria, seja na tristeza, agora sim temos Doutor Tratanildo onipresente nas telas de vitória e de derrota em nossa aventura. O preparo inicial dos elementos e dos fluxos de animação ao se elaborar a variante “feliz” do médico no encontro anterior certamente facilitou nosso trabalho hoje, nos mostrando as diferentes possibilidades possíveis para a criação de elementos que interagem tanto com a interface quanto com scripts controladores e regras do jogo.
Em nossos próximos encontros, prosseguiremos atuando para implementar as diferentes interações entre os elementos tridimensionais do cenário, os personagens e o labirinto de nosso game, tanto por meio de intervenções via editor do Unity quanto por codificações via scripts controladores.
Nosso próximo encontro será no dia 13 de abril. Até mais! Fique sempre ligado nas novidades do GameBlast!
Revisão: Ives Boitano