Por meio de intervenções nos scripts Geral e ControllerFase, configuramos variáveis responsáveis por, dentre outros, armazenar o posicionamento dos agentes de doenças, das pílulas e dos obstáculos dentro do labirinto.
Hoje daremos sequência a esse processo, codificando informações importantes para a gestão da fase corrente da aventura, além de já deixarmos certas “pontes” construídas entre os scripts e os elementos da cena.
Caso seja a primeira vez que você teve a oportunidade de ler um de nossos conteúdos, sinta-se à vontade para nos acompanhar em uma jornada de aprendizados sobre o mundo do desenvolvimento de games. Utilizando a plataforma Unity, estamos elaborando diferentes projetos práticos de programação de jogos, dentre eles o atual projeto, Consultório do Dr. Tratanildo, que consiste na construção de um game ambientado em um consultório médico tridimensional.
Nossa série é feita para todos os públicos, independentemente de terem conhecimentos prévios de programação de jogos ou de sistemas. A partir do primeiro texto da série, abordamos desde os tópicos considerados mais básicos do processo, como a instalação e configuração da ferramenta Unity em nossos computadores, até as etapas práticas da criação de um jogo, como a inserção e posicionamento de elementos nas cenas do projeto e a codificação de scripts controladores de comportamentos e regras.
Quem sabe hoje não seja o dia certo para começar a tirar do papel aquele game que você sempre sonhou em tornar realidade? Venha conosco para que possamos, juntos, seguir nessa trilha rumo a novos conhecimentos!
Fase corrente
Após as intervenções de nosso último encontro, deixamos bem estruturadas as variáveis e os vetores que armazenarão informações úteis sobre as características de cada fase, incluindo o tipo do paciente a ser admitido no consultório, o tempo máximo para a realização do tratamento e quais são os monstros a serem enfrentados no labirinto para se avançar na aventura.
Toda essa estruturação foi codificada na primeira parte das declarações de variáveis do script ControllerFase, conforme podemos notar pela imagem a seguir:
Agora, vamos acrescentar novas variáveis que permitirão ao jogo “entender” a situação atual do jogador, como o tempo restante de fase e quantos agentes de doenças restam ser eliminados para se finalizar o tratamento.
Para tal, vamos abrir o projeto no editor do Unity. 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 Project, abra a pasta Assets e, em seguida, Scripts. Clique duas vezes sobre o ícone do script ControllerFase para iniciarmos sua edição.
Logo após a declaração dos vetores de variáveis responsáveis pela estrutura de composição das fases, insira o seguinte trecho de código:
// Informações sobre a fase corrente
internal int faseCorrente;
internal float tempoRestante;
internal string pilulaMaoEsquerda, pilulaMaoDireita;
internal int qtdMonstrosAzuisRestantes, qtdMonstrosVerdesRestantes, qtdMonstrosRoxosRestantes, qtdMonstrosAmarelosRestantes, qtdMonstrosVermelhosRestantes;
Basicamente, o trecho de código que acrescentamos ao script será responsável por armazenarem as seguintes informações:
- Em qual fase o jogador encontra-se no momento (variável faseCorrente);
- Quanto tempo resta ao jogador para que se finalize o tratamento do paciente atual (tempoRestante);
- Quais pílulas doutor Tratanildo está carregando em cada uma de suas mãos (pilulaMaoEsquerda e pilulaMaoDireita);
- Quantos agentes de doenças necessitam ser extirpados do corpo do paciente para se considerar o tratamento finalizado com sucesso (qtdMonstrosAzuisRestantes e suas variantes das cores verde, roxo, amarelo e vermelho).
Em relação às pílulas que o médico carregará em suas mãos, vale definirmos aqui uma das dinâmicas de interação entre o doutor, o consultório e o paciente: somente será permitido carregar duas pílulas por vez, sendo que, para concluir o tratamento de pacientes com três ou mais monstrinhos dentro de seus corpos, o jogador terá de voltar a buscar mais medicamentos nas prateleiras durante o tratamento para conseguir concluir a ação.
Dessa forma, faremos com que o jogador tenha que planejar bem quais medicamentos irão ser aplicados primeiro, visando concluir o tratamento no menor tempo possível. Além disso, faremos com que haja uma interação maior entre o jogador e o cenário, não restringindo as ações de intervenção médica apenas ao módulo do game ambientado no labirinto.
Note também que, diferentemente das variáveis declaradas anteriormente, declaramos o novo conjunto de elementos com o indicador de privacidade internal. Esse nível de privacidade do código, assim como o public, permite que outros trechos de código e scripts consigam enxergar, ler e escrever conteúdos nas variáveis declaradas, mas, ao contrário do observado com public, o uso de internal faz com que os valores das variáveis não sejam alteráveis diretamente via interface do editor do Unity.
Como as novas variáveis são de uso interno do script para controle de informações sobre a fase corrente, não há a necessidade de modificarmos seus valores via editor.
Elementos de cena
Logo após o bloco de códigos introduzido no script, vamos incluir mais um conjunto de variáveis importantes para a gestão da fase que permitirão a interação de fato com os elementos da cena:
// Elementos da cena (Canvas + Laboratório)
public GameObject doutorCenario, doutorConversa, doutorTratamento, doutorFelicidade, doutorTristeza;
public GameObject telaPause, telaVitoria, telaDerrota;
public GameObject visualizacaoLabirinto, barraInfoAcoes;
public Camera[] camerasTratamento;
public Text textoTempoRestante, textoMensagemMomento;
public Text mensagemPapelEsquerda, mensagemPapelDireita;
public MontaLabirinto controladorLabirinto;
A nova relação de variáveis declaradas vai permitir que os comandos realizados por intervenção do script sejam refletidos em ações concretas dos elementos da cena vigente, como a redução dinâmica do valor de tempo mostrado em tela por meio de textoTempoRestante, a aparição das telas de vitória ou de derrota nos momentos adequados e as intervenções necessárias à construção do desafio (por intermédio de ControladorLabirinto).
Declaradas as variáveis, salve o script e feche o Visual Studio. Retorne ao editor do Unity para introduzirmos o elemento controlador da fase, ainda que de forma prévia.
A primeira alteração que realizaremos é algo que, embora não seja essencial, irá nos auxiliar na organização dos elementos que representam o médico em cena posteriormente, visto que iremos introduzir nos próximos encontros algumas “variantes comportamentais” do famoso doutor em cena, como por exemplo as versões em que Tratanildo aparece se sentindo triste ou feliz.
Na aba Hierarchy, selecione o GameObject Doutor_rindo, subordinado a Personagens. Renomeie-o para “DoutorCenario”, sem as aspas, conforme exemplificado a seguir:
Feita a correção de nomenclatura do objeto do doutor, ainda na aba Hierarchy iremos inserir um novo GameObject, clicando com o botão direito sobre uma área vazia da lista e, no menu suspenso exibido, selecionando a opção Create Empty.
Conceda o nome “ControladorFase” ao novo objeto. Selecione-o e conceda o valor 0 aos três parâmetros (X, Y e Z) do atributo Position de seu componente Transform, via aba Inspector.
Ainda na aba Inspector, por meio da opção Add Component, adicione um componente de tipo Controller Fase. Após a inserção, vamos configurar seus campos com os seguintes valores:
- Doutor Cenario: conceda o valor que representa o objeto recém-renomeado (DoutorCenario);
- Tela Pause: indique o objeto de nome TelaPause;
- Tela Vitoria: indique o objeto de nome TelaVitoria;
- Tela Derrota: indique o objeto de nome TelaGameOver;
- Visualizacao Labirinto: indique o objeto de nome VisualizacaoLabirinto;
- Barra Info Acoes: indique o objeto de nome BarraInformacoesAcao;
- Cameras Tratamento: conceda o valor 2 ao tamanho do vetor, e preencha os valores de seus elementos internos conforme segue:
- Element 0: indique o objeto de nome CameraLabirinto_01;
- Element 1: indique o objeto de nome CameraLeito_01;
- Texto Tempo Restante: indique o objeto de nome TempoRestante;
- Texto Mensagem Momento: indique o objeto de nome MensagemMomento;
- Mensagem Papel Esquerda: indique o objeto de nome TextoMensagem_Esq;
- Mensagem Papel Direita: indique o objeto de nome TextoMensagem_Dir;
- Controlador Labirinto: indique o objeto de nome Labirinto.
Para facilitar, confira na imagem a seguir como as variáveis públicas de Controller Fase serão exibidas no editor após a indicação dos valores de seus atributos:
Ainda restam alguns valores a serem concedidos, mas já temos um bom norte para começarmos a codificação dos comportamentos do game. 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
Agora que já temos um bom conjunto de variáveis declaradas no script controlador das fases do game, poderemos, nos próximos encontros, iniciar o processo de codificação das ações, rotinas e regras gerais de nossa aventura, permitindo que Tratanildo Doencita possa, finalmente, receber seus pacientes em seu consultório, curando os enfermos e divertindo a todos nós. Parabéns por ter alcançado essa etapa!
Nosso próximo encontro será no dia 23 de março. Até mais! Fique sempre ligado nas novidades do GameBlast!
Revisão: Ives Boitano