Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Após a realização, no encontro anterior, de interessantes intervenções em nosso projeto, ajustaremos parâmetros e scripts para que o jogador possa selecionar elementos dos menus com um controle de videogame, avance nas etapas envolvendo as cutscenes do jogo e consiga, enfim, experimentar nossa aventura virtual “de cabo a rabo” com seu joystick do Xbox One / Xbox Series.
Se esta é a primeira vez que você lê conteúdos de nossa série, aproveite a oportunidade para conhecer mais sobre como ferramentas de desenvolvimento de jogos como a Unity podem nos permitir a tirar do papel os jogos que sempre sonhamos em tornar realidade.
Encontro a encontro, vamos construindo projetos práticos de programação de jogos, dos mais variados estilos gráficos e de gameplay. A cada etapa da construção, vamos experimentando diferentes métodos, técnicas e recursos utilizados por diversos estúdios de criação de games que utilizam a Unity em seus projetos, tais como os empregados na construção de games como Among Us, Cuphead e Super Bomberman R.
Você está convidado a, a partir do primeiro tópico da série, acompanhar as etapas de desenvolvimento, replicar os experimentos ilustrados e, enfim, aprender a desenvolver por conta própria jogos tanto em 2D quanto em 3D. Abordamos desde a instalação e a configuração da ferramenta Unity em nossos computadores até as etapas em que, de fato, colocaremos a “mão na massa” e construiremos fases e desafios para nossas aventuras virtuais.
Até o momento, concluímos a construção de dois jogos bidimensionais: o platformer Motorista da Pesada e a homenagem ao clássico Pong, Forest Ping Pong. Atualmente, estamos desenvolvendo o puzzle Consultório do Dr. Tratanildo, ambientado em um consultório médico tridimensional. Por meio do índice, disponibilizado no primeiro texto da série, você poderá acompanhar e replicar os passos necessários para a criação dos três games citados, podendo até mesmo experimentar builds dos dois primeiros jogos, diretamente de seu navegador.
Se você curte a ideia de aprender a criar seus próprios jogos digitais, não perca mais tempo e junte-se a nós em uma estrada repleta de novos conhecimentos e de muita diversão!
Após ajustarmos o comportamento de determinados scripts de nosso projeto para que o jogador possa movimentar o médico pelo cenário, pegar itens pelo consultório e controlar a inclinação do labirinto com seu controle do Xbox One, precisamos realizar mais algumas intervenções para que os demais elementos do jogo também apresentem interação com esse tipo de input.
Resolvendo a questão dos menus e das cutscenes, teremos praticamente a aventura completa à disposição de quem prefira interagir com o game utilizando seu joystick.
As primeiras intervenções que realizaremos permitirão selecionarmos e acionarmos botões e toggles das diferentes telas do menu inicial com o controle. 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 Unity, na aba Project, abra a pasta Assets e, em seguida, Scenes. Clique duas vezes sobre o ícone da cena ConsultorioScene.
A primeira intervenção que realizaremos será sobre o objeto EventSystem, presente na aba Hierarchy. Selecionando-o, podemos observar que, na aba Inspector, além do costumeiro componente Transform, existem dois componentes que são responsáveis por, dentre outras funções, detectar o pressionamento de teclas e de botões em teclados, mouses e joysticks, endereçando os comandos aos devidos elementos do jogo: Standalone Input Module e Event System:
O componente Event System é o responsável por controlar os diferentes Input Modules que possam estar ativos no momento, durante a execução do jogo, além de armazenar dados relevantes de navegação de elementos da interface do jogo, tais como qual é o objeto selecionado no momento. Input Modules, por sua vez, são módulos responsáveis pela conversão entre dados recebidos por dispositivos (ex.: pressionamento de teclas ou de botões, cliques do mouse etc.) e ações, dentro do contexto do jogo.
Por padrão, o Unity já nos fornece alguns Input Modules que controlam boa parte das entradas possíveis, no contexto de um computador ou de um console. O Standalone Input Module, atrelado ao objeto Event System, consegue detectar dados de diferentes entradas, descritas na listagem de entradas do Input Manager do Unity (ex.: o eixo Horizontal ou o botão Submit, presentes em teclados e joysticks).
Para a navegação nos menus e telas do game, utilizaremos os valores padrão, presentes no atual Standalone Input Module em evidência. Em outras palavras, a navegação horizontal pelos itens dos menus será realizada pelo elemento atrelado ao eixo Horizontal (analógico esquerdo do controle, teclas A, D e setas horizontais do teclado); a navegação vertical, pelo eixo Vertical (analógico esquerdo do controle, teclas W, S e setas verticais do teclado); e a confirmação de itens pelo botão atrelado à entrada Submit do Input Manager (botão A do controle, teclas Enter e espaço do teclado).
A alteração que realizaremos, no entanto, será voltada ao componente Event System: altere o valor de seu atributo First Selected para o objeto BotaoIniciarPartida, conforme ilustrado pela imagem a seguir.
O parâmetro First Selected indica ao Unity qual será o primeiro GameObject selecionado, relacionado ao Event System atualmente ativo. Em nosso caso, ao se iniciar o jogo, o botão responsável por iniciar a partida será o selecionado no momento.
Por falar em objetos selecionados, é importante que o jogador consiga identificá-los, seja por meio do uso de uma coloração diferente ou de outro artefato visual (uma borda, por exemplo). Vamos configurar os elementos presentes no menu inicial e na tela de opções, para que seja de fácil visualização o elemento selecionado no momento.
Identificando visualmente o elemento selecionado
Na aba Hierarchy, selecione os objetos BotaoIniciarPartida, BotaoOpcoes e BotaoSobre, subordinados a Botoes, dentro da estrutura de MenuInicial. Na aba Inspector, dentro do conjunto de opções relacionadas a seus componentes Button, localize a opção Selected Color e modifique a cor indicada para a representada pelos parâmetros R = 200, G = 255, B = 255 e Y = 255.
Assim que um determinado botão estiver selecionado, ele adotará a coloração azul clara escolhida. A navegação entre os botões, por padrão, ocorre de forma automática, seguindo o posicionamento dos elementos. Para visualizarmos qual é a sequência atual de navegação entre os botões, clique no botão Visualize, logo abaixo do parâmetro Navigation do componente Button.
É possível perceber, na ilustração anterior, a presença de pequenas setinhas entre os botões. Essas setinhas representam a sequência de navegação a ser seguida entre os elementos, assim que, por exemplo, o jogador movimentar o analógico esquerdo do controle para os lados. Sequencialmente, um dos três botões adotará a cor azul, representando estar selecionado no momento.
É possível modificar explicitamente essa ordem, alterando o valor do atributo Navigation e indicando quais são os elementos a serem considerados para a sequência de navegação pelo Unity. No entanto, como a complexidade dos nossos menus é baixa, em nosso projeto não alteraremos o valor do parâmetro, mantendo-o como Automatic mesmo. Clique novamente sobre o botão Visualize para ocultar as setinhas ilustrativas.
A seguir, desative o GameObject Botoes e ative o objeto TelaOpcoes, para realizarmos edições em seus elementos gráficos. O primeiro a receber intervenções será o objeto Voltar; selecione-o e, na aba Inspector, realize as mesmas alterações ao valor do atributo Selected Color de seu componente Button que concretizamos há pouco para os demais botões do projeto, conforme indicado pela ilustração a seguir.
Selecione, em seguida, os objetos OpcaoMouse, OpcaoTeclado e OpcaoDificuldade, subordinados a OpcoesControles; além de OpcaoNormal e OpcaoAlta, subordinados a OpcoesDificuldades. Modifique o valor do atributo Selected Color de seus componentes de tipo Toggle para a mesma cor utilizada no parâmetro homônimo dos botões.
Experimente clicar sobre o botão Visualize, logo abaixo do parâmetro Navigation, para visualizar as setinhas ilustrativas de navegação entre os elementos. Ao final da visualização, clique novamente em Visualize para desativar a exibição.
Em seguida, volte a selecionar o GameObject Voltar. Na aba Inspector, localize o conjunto de atributos OnClick de seu componente Button. Clique sobre o ícone com o símbolo + (destacado em verde, na imagem a seguir), no campo destacado em laranja, indique o objeto BotaoIniciarPartida e, no elemento destacado em azul, escolha a opção Button e, em seguida, Select, conforme exemplificado a seguir:
O comando adicional, atrelado ao evento OnClick, indicará ao Unity que, ao se acionar o botão Voltar, o botão responsável pelo início da partida deverá ser selecionado, ficando destacado em azul na interface, pronto para ser acionado pelo jogador.
A seguir, desative o GameObject TelaOpcoes, ativando em seguida o objeto Botoes. Selecione BotaoOpcoes para realizarmos ação semelhante ao que acabamos de aplicar ao botão Voltar: na aba Inspector, localize o conjunto de atributos OnClick de seu componente Button. Clique sobre o ícone com o símbolo + (destacado em verde, na imagem a seguir), no campo destacado em laranja, indique o objeto OpcaoMouse e, no elemento destacado em azul, escolha a opção Toggle e, em seguida, Select, conforme exemplificado a seguir:
Dessa forma, o Unity saberá que, ao se acionar o botão para exibição das opções do game, o primeiro elemento selecionado será o Toggle OpcaoMouse, presente no canto superior esquerdo da lista de opções do menu.
Em relação aos menus, já configuramos tudo o que é necessário para que o jogador consiga acessar as opções presentes, configurar o game e iniciar a partida com seu joystick. Agora, vamos realizar as intervenções necessárias para que seja possível passar pelas cutscenes do jogo sem a necessidade de se clicar na tela para tal.
Na aba Hierarchy, selecione o objeto ColliderProximaEtapa. Trata-se do GameObject responsável pela detecção dos cliques na tela responsáveis pelo avanço dos diálogos entre o médico e os pacientes exibidos em cena.
Na aba Inspector, note a presença do componente Event Trigger. O conjunto de atributos Pointer Click foi introduzido por nós anteriormente, permitindo a execução do avanço das etapas no jogo nas cutscenes.
Além do comando para detecção do clique do mouse, o componente Event Trigger permite a detecção de outros eventos para a execução de comandos específicos. Um desses eventos é o pressionamento do botão Submit, enquanto o objeto a qual Event Trigger está atrelado estiver selecionado. Isso será útil para nós, pois permitirá ao jogador avançar as telas com diálogos entre os personagens pressionando o botão A do controle, ou as teclas Enter ou espaço do teclado.
Para tal, clique no botão Add New Event Type e, no menu suspenso exibido, selecione a opção Submit. Por padrão, o novo conjunto de atributos copia elementos do conjunto anteriormente configurado (Pointer Click), portanto, não será necessário alterar os valores destacados em laranja, na imagem a seguir, pois já correspondem ao que queremos (a execução da função ProximaEtapa, de ControllerFase).
Para que tudo funcione adequadamente, é importante que, ao serem exibidos os diálogos durante as sessões de jogo, ColliderProximaEtapa seja considerado pelo sistema de eventos do Unity como sendo o objeto selecionado no momento. Para tal, vamos realizar pequenas edições no conteúdo do script ControllerFase.
Na aba Project, abra a pasta Assets e, em seguida, Scripts. Clique duas vezes sobre o ícone do script ControllerFase para iniciarmos sua edição no Visual Studio.
Para modificarmos parâmetros do sistema de eventos do Unity, ao final do primeiro bloco de comandos do script (com linhas iniciadas pela palavra using), acrescente a seguinte linha de código:
Em seguida, dentro do bloco de comandos da função MostrarMensagemPaciente, localize a linha em que há a ativação do GameObject objetoColliderCanvas e introduza imediatamente em seguida o comando abaixo:
EventSystem.current.SetSelectedGameObject(objetoColliderCanvas);
A mesma intervenção deverá ser realizada dentro do bloco de comandos da Coroutine pacienteCurado. Localize o comando correspondente à ativação do GameObject objetoColliderCanvas e introduza a seguir a mesma linha de código, conforme exemplificado pela ilustração abaixo:
As inserções de código permitem ao jogo entender quais são os momentos em que o colisor deve ser considerado selecionado pelo Event System do Unity, permitindo a interação do elemento com o controle de videogame, o que, na prática, permitirá ao jogador avançar aos momentos de ação do jogo, a partir do menu inicial do game.
Salve o script e feche o Visual Studio. Retorne ao editor do Unity para experimentar a execução do jogo, indo à aba Game e clicando sobre o ícone do botão Play.
