Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Depois de resolvermos, em nosso encontro anterior, questões envolvendo problemas de colisão entre nosso querido médico e os limites do cenário, avançaremos rumo a conclusão da construção de nosso game, implementando funcionalidade para pausar o game e para recomeçar a aventura, em caso de game over.
Se hoje for a primeira vez que você tem contato com conteúdos de nossa série, sinta-se especialmente convidado a acompanhar-nos em uma jornada interessante em busca de novos conhecimentos sobre o mundo do desenvolvimento de jogos digitais.
Ao desenvolvermos projetos práticos de programação de jogos, aprendemos sobre como ferramentas de criação de games, como a Unity, podem nos auxiliar a tirar do papel projetos variados, abordando estilos gráficos e de gameplay distintos.
A partir do primeiro tópico da série, abordamos desde os passos iniciais do processo de desenvolvimento de um game, como a instalação e a configuração da ferramenta Unity em nossos computadores, até os elementos em que colocarmos as “mãos na massa” para valer, programando regras e comportamentos de itens, de personagens e de cenários de um jogo, além do posicionamento e da configuração dos objetos pertencentes aos mundos mágicos de nossas aventuras.
Os conceitos apresentados nos textos são abordados por meio de exemplos, aplicados diretamente nos projetos que elaboramos. Por isso, não se preocupe se você não tem conhecimentos prévios de programação de jogos ou de sistemas, pois, mesmo assim, você terá a possibilidade de fazer acontecer os projetos que sempre sonhou em tornar realidade.
Durante a elaboração de nossa série, já produzimos dois games 2D: trata-se de Forest Ping Pong, uma homenagem ao clássico Pong (Atari, 1972); e de Motorista da Pesada, um platformer inspirado no arcade japonês City Connection (Jaleco, 1985).
Atualmente, estamos trabalhando no projeto de construção do jogo Consultório do Dr. Tratanildo. Ambientado em um consultório médico tridimensional, o game mescla aspectos de gameplay inspirados em clássicos dos anos 1980 e 1990, como Dr. Mario (Nintendo, 1990) e Pac-Man (Namco, 1980).
Vale muito a pena visitar os textos em que são detalhados os passos para elaboração dos três games, acessíveis por meio do índice disponibilizado no primeiro texto da série. É possível, inclusive, experimentar os dois primeiros jogos completos, diretamente de seu navegador, por meio de entradas específicas nos últimos textos relacionados a eles.
Caso você tenha gostado dessa ideia, não perca mais tempo: aperte os cintos e junte-se a nós nessa estrada repleta de novos conhecimentos e de muita diversão!
Em encontros anteriores, configuramos os elementos gráficos que serão exibidos em tela assim que o jogo for pausado, além dos correspondentes aos momentos em que se vence ou se perde o game. As duas últimas telas foram configuradas para serem mostradas adequadamente, já a restante aguardava a implementação da funcionalidade de pausar o game para que pudesse ser exibida.
Vamos implementar essa funcionalidade, realizando intervenções no script controlador de fases do game e em configurações do projeto em si. Para tal, vamos abrir 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 Unity, na aba Project, abra a pasta Assets e, em seguida, Scenes. Clique duas vezes sobre o ícone da cena ConsultorioScene.
Inicialmente, configuraremos o reconhecimento, pelo projeto, do botão de menu do controle do Xbox, cujo suporte implementamos há alguns encontros. Na interface do editor do Unity, clique sobre o menu Edit e, em seguida, selecione a opção Project Settings.
Na janela apresentada, selecione o item Input Manager e, em seguida, amplie o quantitativo do campo Axes Size em uma unidade. Na prática, como observamos anteriormente, o último item será duplicado, conforme exemplificado a seguir.
Expanda o grupo de opções relacionado ao último item da listagem e realize as seguintes alterações em seus atributos:
Name: conceda o nome “Xbox_Start” como valor para o atributo;
Positive Button: troque o valor do campo para “joystick button 7”;
Type: selecione a opção Key or Mouse Button;
Embora o botão de menu do controle do Xbox One não apresente oficialmente o nome “Start” atrelado a si, como essa era a nomenclatura nos tempos do Xbox 360, considerei utilizar esse nome para facilitar a lembrança sobre qual botão estamos tratando, ao codificarmos os scripts. Caso prefira utilizar outro nome, fique à vontade.
Na funcionalidade para pausar o game que implementaremos em instantes, tanto o referido botão do controle do Xbox quanto a tecla Esc do teclado servirão para pausar e para retomar o game.
Realizaremos uma sequência de intervenções no script ControllerFase para que possamos implementar a nova funcionalidade. Feche a janela Project Settings e retorne à interface principal do Unity. 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.
A primeira intervenção envolverá a declaração de duas novas variáveis, a serem inseridas no final do bloco de variáveis referentes às informações sobre a fase corrente. Localize a declaração da string etapaAtual e, logo após, insira as seguintes linhas de código:
internal string modoDeJogoAnterior = "Início"; // Utilizado para pausar o game
internal bool statusBarraInferiorAoPausar = false;
Utilizaremos o conteúdo da variável modoDeJogoAnterior para decidirmos se o jogo deverá ser pausado ou retomado, devolvendo o game ao modo de jogo anterior à interrupção, caso seja decidido pela retomada de sua execução.
Já statusBarraInferiorAoPausar será a variável cujo conteúdo determinará à lógica do jogo se a barra inferior será reexibida ou não ao se retomar a execução do jogo. Essa necessidade ocorre devido ao fato de que o jogo pode ser pausado em diferentes momentos, com a barra inferior sendo exibida ou não imediatamente antes da interrupção.
Com as variáveis devidamente declaradas, procure o código correspondente à função Update. Logo após o fechamento de suas chaves, imediatamente antes da declaração da função AtenderPaciente, introduza o seguinte grupo de comandos:
if (modoDeJogoAnterior == "Início" || modoDeJogoAnterior == "Pausado")
modoDeJogoAnterior = Geral.ModoDeJogoCorrente;
telaPause.GetComponentInChildren<Button>().Select();
statusBarraInferiorAoPausar = FindObjectOfType<ConcedePilula>().barraInferior.gameObject.activeSelf;
FindObjectOfType<ConcedePilula>().barraInferior.gameObject.SetActive(false);
// Reexibe a seta do mouse, caso aplicável
if (Geral.ModoDeControle == "Teclado+Mouse")
Geral.ModoDeJogoCorrente = modoDeJogoAnterior;
FindObjectOfType<ConcedePilula>().barraInferior.gameObject.SetActive(statusBarraInferiorAoPausar);
// Oculta a seta do mouse, caso aplicável
Cursor.lockState = CursorLockMode.Locked;
A nova função Pausar será a principal responsável pela realização dos comandos relacionados à exibição da tela de pause e, também, à retomada do jogo em seu estado anterior.
Note que o uso da variável modoDeJogoAnterior determina se o jogo será pausado ou retomado. Sua atualização ocorre ao se executar um dos dois blocos principais de comandos da função: assumindo o valor de ModoDeJogoCorrente, ao se pausar o game, ou retomando o valor “Pausado”, caso ocorra a ação contrária.
Assim como adotamos como prática nos jogos anteriores, a interrupção ou retomada do jogo se dá por meio da alteração do valor de Time.timeScale. Embora possa parecer estranho à primeira vista não termos concedido o valor 0 à variável ao se pausar o game, realizaremos justamente essa intervenção em outro trecho de código, em instantes, ainda dentro do escopo do script ControllerFase.


