Se esta for a primeira vez que você está lendo conteúdos de nossa série, aproveite a oportunidade para conhecer mais sobre os projetos de programação de games que estamos desenvolvendo, como forma de aprendizado prático sobre os conceitos envolvidos na criação de jogos virtuais.
Utilizando a ferramenta Unity, estamos explorando diferentes métodos, técnicas e ferramentas para tirarmos do papel os jogos que sempre sonhamos em tornar realidade. A partir do primeiro tópico, são abordados desde os tópicos mais elementares dessa jornada, como a instalação e a configuração da ferramenta em nossos computadores, até as etapas em que, de fato, colocamos a “mão na massa”, elaborando cenários das aventuras, configurando elementos multimídia das fases, posicionando personagens e objetos, e codificando as regras e comportamentos dos elementos.
No momento, estamos trabalhando no projeto de criação do puzzle Consultório do Dr. Tratanildo. Trata-se de um game ambientado em um excêntrico consultório médico tridimensional, cujos aspectos de gameplay remetem a clássicos dos anos 1980 e 1990, como Pac Man (Namco, 1980) e Dr. Mario (Nintendo, 1990). Anteriormente na série, elaboramos outros dois jogos 2D, Motorista da Pesada e Forest Ping Pong. Vale muito a pena conferi-los, por meio do índice disponibilizado no primeiro texto da série.
Não se preocupe caso você não tenha tido a oportunidade prévia de aprender conceitos sobre programação de jogos ou de sistemas em geral, pois nossa série é desenvolvida pensando justamente em quem tem vontade de transformar seus projetos pessoais em realidade, mas ainda não sabe bem ao certo por onde começar. Para isso, todos os passos envolvidos nos processos de elaboração dos módulos dos jogos são explicados de forma detalhada, preferencialmente utilizando exemplos e ilustrações, para que você possa replicar as ações em seus projetos posteriormente.
Caso você tenha gostado da ideia de colocar em prática as ideias dos games que, hoje, povoam sua imaginação, não perca mais tempo e junte-se a nós em uma divertida jornada rumo a novos conhecimentos!
Movimentações com teclado e mouse
Até o momento, as interações do jogador com os elementos presentes em Consultório do Dr. Tratanildo são realizadas majoritariamente por meio do teclado. Realizamos anteriormente ajustes para permitir o deslocamento do personagem principal pelo cenário utilizando as teclas W, A, S e D, além das setas do teclado, mas é notório que a movimentação e as rotações do personagem, além do manejo do labirinto, aparentam ser “duras” demais, sobretudo em comparação aos jogos atuais, que já utilizam o mouse para facilitar a navegação pelos cenários há um bom tempo.
Pensando em melhorar esse aspecto de nosso game, vamos implementar hoje, por meio de intervenções em scripts controladores, formas interessantes de se utilizar o mouse para ajudar Tratanildo Doencita em sua saga contra as doenças.
Vamos começar nossas intervenções abrindo o projeto para edição. Abra o Unity Hub e 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.
Novamente na aba Project, vamos abrir a pasta Assets e, em seguida, Scripts. Clique duas vezes sobre o ícone do script Geral para editarmos seu conteúdo no Visual Studio.
Introduza as seguintes linhas de código, imediatamente antes do último fechamento de chaves do arquivo.
// Modos de controle: "SoTeclado", "Teclado+Mouse", "Controle"
public static string ModoDeControle = "Teclado+Mouse";
Por meio do uso da variável estática ModoDeControle, o jogo saberá se ele deve adequar determinados elementos responsáveis pela movimentação dos personagens ao tipo de controle utilizado pelo jogador no momento.
Em nosso projeto, os elementos do jogo poderão ser controlados utilizando somente o teclado (“SoTeclado”), utilizando teclado e mouse simultaneamente (“Teclado+Mouse”) ou utilizando um controle de videogame (“Controle”), sendo que esta última opção configuraremos posteriormente.
Salve o script, minimize o Visual Studio e retorne ao editor do Unity. Ainda com a pasta Scripts em evidência na aba Project, clique duas vezes sobre o ícone do script ControllerMov_Tank para editarmos seu conteúdo.
Dentro da estrutura do método Update, substitua o conteúdo relativo ao controle da movimentação lateral do personagem pelo conteúdo descrito a seguir.
//Controle da movimentação lateral (tank)
Vector3 rotacaoPersonagem = transform.eulerAngles;
switch (Geral.ModoDeControle)
{
case "SoTeclado":
case "Controle":
if (Input.GetAxis("Horizontal") > 0.5)
rotacaoPersonagem.y += (Time.deltaTime * 120);
else if (Input.GetAxis("Horizontal") < -0.5)
rotacaoPersonagem.y -= (Time.deltaTime * 120);
break;
case "Teclado+Mouse":
rotacaoPersonagem.y += (Time.deltaTime * Input.GetAxis("Mouse X") * 600);
break;
}
transform.eulerAngles = rotacaoPersonagem;
No novo bloco de comandos introduzido, foi introduzida uma estrutura de controle de fluxo “switch...case” para separarmos os comandos da seguinte forma:
- Caso a movimentação do jogo esteja sendo realizada por intermédio do teclado ou do controle, os comandos “antigos” para identificação da rotação do personagem continuam sendo válidos.
- Caso a movimentação esteja configurada para ocorrer com teclado e mouse, a movimentação do personagem para frente não é alterada, mas a rotação dependerá do deslocamento do mouse no eixo X, por meio do comando Input.GetAxis("Mouse X").
O nome do eixo referenciado pelo comando (“Mouse X”) deriva da lista de inputs que o Unity oferece, por meio do módulo Input Manager, que exploramos há alguns encontros, durante a etapa de adequações para configurarmos a movimentação do personagem por meio das teclas W, A, S e D. A imagem a seguir ilustra a posição de “Mouse X” na lista.
De volta ao código, note que, diferentemente do método anterior, estamos multiplicando o valor obtido pelo deslocamento do mouse por 600 em vez de 120. Isso deve-se à sensibilidade do mouse, que, sob os parâmetros anteriores, exigiriam uma movimentação grande por parte do jogador para girar o personagem. No entanto, essa multiplicação do valor por cinco pode ser alterada por outro valor, caso você prefira.
Salve o script, volte a minimizar o Visual Studio e a retornar ao editor do Unity para, dessa vez, experimentarmos a execução do jogo, indo à aba Game e clicando sobre o ícone do botão Play.
Tirando a seta
Embora ao se agregar o uso do mouse no processo a rotação do personagem tenha melhorado bastante, normalmente os jogos com esse tipo de abordagem ocultam a exibição da seta, possibilitando que o jogador interaja com o game sem distrações e impedindo interações indesejadas com elementos de fora da janela do game.
Para “darmos um sumiço” na seta de forma temporária, introduziremos alguns comandos no script controlador de fases para que ela saia de cena apenas quando necessário. Em outras palavras, a seta do mouse continuará visível em menus e outras telas em que seja interessante a sua presença.
Interrompa a simulação do jogo, clicando novamente sobre o ícone do botão Play, e retorne à aba Scene. Por intermédio da abai Project, dentro da pasta Scripts clique duas vezes sobre o ícone do script ControllerFase.
A primeira intervenção será responsável por ocultar a seta do mouse; essa intervenção deverá ocorrer logo após a etapa de conversas entre paciente e médico, quando, de fato, iremos iniciar o controle da movimentação de Tratanildo pelo cenário.
Dentro da estrutura de códigos do método TransicaoParaTratamento, imediatamente antes do último fechamento de chaves, insira as seguintes linhas de código.
// Oculta a seta do mouse, caso aplicável
if (Geral.ModoDeControle == "Teclado+Mouse")
Cursor.lockState = CursorLockMode.Locked;
Ao alterarmos o valor do atributo Cursor.lockState para CursorLockMode.Locked, informamos ao Unity que a posição do mouse deverá ser “trancada” ao centro da tela do game, ocultando a representação visual da seta. Dessa forma, além de não termos o elemento visível em cena, o risco de darmos um clique acidental fora da área da janela do game se esvai.
Outros valores possíveis para o atributo Cursor.lockState são CursorLockMode.Confined, em que a seta do mouse continua visível mas seu deslocamento fica confinado somente à área da janela (ou tela) do game, e CursorLockMode.None, em que não há restrições para a movimentação da seta do mouse.
Ainda em ControllerFase, vamos introduzir os comandos para que a seta volte a ser exibida assim que o tratamento dos pacientes é finalizado e, também, em caso de derrota do jogador.
Dentro da estrutura de códigos da Coroutine pacienteCurado, introduza o seguinte conjunto de comandos imediatamente antes da linha de código etapaAtual = "DialogoFinal", conforme indicado pela ilustração a seguir.
// Reexibe a seta do mouse, caso aplicável
if (Geral.ModoDeControle == "Teclado+Mouse")
Cursor.lockState = CursorLockMode.None;
O mesmo conteúdo deverá ser introduzido dentro do bloco de comandos da função Update, mais especificamente antes do fechamento de chaves do bloco referente a quando se acaba o tempo restante.
Movimentando o labirinto com o mouse
A última intervenção de hoje envolverá o manejo das inclinações do labirinto por meio do uso do mouse. Esse controle será realizado considerando tanto movimentações horizontais quanto verticais do periférico, o que agregará bastante ao fator diversão do núcleo de nosso jogo.
Via aba Project, clique duas vezes sobre o ícone do script ControllerMov_Labirinto para iniciarmos sua edição.
Substitua os blocos de comandos referente às inclinações “para frente e para trás” e “para os lados” pelo conjunto de linhas de comando a seguir:
switch (Geral.ModoDeControle)
{
case "SoTeclado":
case "Controle":
// Para "frente" e para "trás"
if (Input.GetAxis("Vertical") > 0.5)
alteracoesInclinacao.z -= taxaInclinacao * Time.deltaTime;
if (Input.GetAxis("Vertical") < -0.5)
alteracoesInclinacao.z += taxaInclinacao * Time.deltaTime;
// Para os lados
if (Input.GetAxis("Horizontal") < -0.5)
alteracoesInclinacao.x += taxaInclinacao * Time.deltaTime;
if (Input.GetAxis("Horizontal") > 0.5)
alteracoesInclinacao.x -= taxaInclinacao * Time.deltaTime;
break;
case "Teclado+Mouse":
alteracoesInclinacao.z -= taxaInclinacao * Time.deltaTime * Input.GetAxis("Mouse Y") * 5;
alteracoesInclinacao.x -= taxaInclinacao * Time.deltaTime * Input.GetAxis("Mouse X") * 5;
break;
}
- Caso a movimentação do jogo esteja sendo realizada por intermédio do teclado ou do controle, os comandos “antigos” continuam válidos para as inclinações a serem aplicadas ao labirinto.
- Caso a movimentação esteja configurada para ocorrer com teclado e mouse, o fator a ser aplicado à rotação do objeto (alteracoesInclinacao) receberá como entrada os valores dos eixos Mouse Y e Mouse X, multiplicados pelos demais parâmetros utilizados anteriormente (taxaInclinacao e Time.deltaTime) e por cinco.
A multiplicação por cinco foi adotada para dar maior dinamicidade à movimentação, mas, assim como em ControllerMov_Tank, você pode alterar para o valor que preferir.
Salve o script, feche o Visual Studio e experimente a execução do jogo, indo à aba Game e clicando sobre o ícone do botão Play.
É possível notar que, logo após a cutscene inicial, a seta é ocultada, permitindo ao jogador se concentrar na movimentação do personagem principal pelo cenário.
Veja como as mudanças aplicadas aos recursos de movimentação do médico e do labirinto podem alterar o senso de desafio do jogo.
Por fim, caso o jogador perca a partida, a seta do mouse é restaurada a contento, conforme ilustração a seguir.
Não se esqueça de, após interromper a simulação, salvar a cena (menu File, Save) e o projeto (menu File, Save Project) antes de fechar o Unity.
Próximos passos
É sempre gratificante quando conseguimos melhorar aspectos de gameplay de nossos jogos, trazendo mais fluidez e diversão ao núcleo de nossa aventura. É o caso de nossas intervenções de hoje, que puderam trazer mais dinamicidade ao game por meio da adoção do mouse como uma alternativa para a movimentação do personagem e da inclinação do labirinto.
Em nossos próximos encontros, implementaremos formas para que o jogador escolha qual tipo de controle deseja utilizar para o game, por intermédio dos menus iniciais do jogo. Além disso, temos alguns bugs importantes a serem resolvidos, envolvendo aspectos de colisão entre o médico e elementos do cenário.
Nos encontraremos novamente no próximo dia 31 de maio. Até mais! Fique ligado sempre nas novidades do GameBlast!
Revisão: Ives Boitano



















