Para quem está lendo os conteúdos de nossa série pela primeira vez, considere-se especialmente convidado a juntar-se a nós em um divertido processo de aprendizado sobre o universo do desenvolvimento de jogos digitais.
Por meio do uso da ferramenta Unity, estamos experimentando criar variados projetos práticos de programação de games; com isso, podemos aprender e experimentar conceitos sobre as mais diversas etapas da elaboração de uma aventura.
No momento, estamos trabalhando no projeto Consultório do Dr. Tratanildo. Trata-se de um game ambientado em um consultório médico tridimensional, que, em relação a seus aspectos de gameplay, presta homenagem a puzzles e adventures famosos das décadas de 1980 e 1990, tais como Dr. Mario (Nintendo) e Pac-Man (Namco).
Caso você não tenha tido a oportunidade prévia de conhecer aspectos de programação de jogos ou de sistemas, fique tranquilo: nossa série foi pensada justamente para auxiliar quem quer tirar do papel aquele projeto que sempre sonhou em ver tornar-se realidade, mesmo se não tiver experiências anteriores com os conceitos técnicos da área.
A partir do primeiro texto da série, abordamos desde as etapas mais básicas do processo, como a instalação e configuração da ferramenta Unity em nossas máquinas, até as etapas em que, de fato, se “coloca a mão na massa” pra valer, tais como a construção de cenários e fases, a construção das regras e interações dos entes do projeto e a codificação de scripts controladores de comportamentos entre os diferentes componentes presentes em uma cena.
Gostou dessa ideia? Então, prepare-se para juntar-se a nós nesta caminhada rumo a novos conhecimentos!
Sequência dos tratamentos
Desde as etapas iniciais da concepção de nosso game, estamos trabalhando no desenvolvimento de diferentes módulos muito importantes para a construção de Consultório do Dr. Tratanildo. Já desenvolvemos, por exemplo, a construção física dos elementos do consultório e do labirinto que representa o interior dos corpos dos pacientes, as pílulas e suas características únicas de tratamento contra os agentes de doenças, o módulo de controle da movimentação do médico pelo cenário e o sistema de contagem regressiva de tempo durante a realização do tratamento.
Todo esse desenvolvimento é essencial para que nosso game possa sair do papel em breve; além, é claro, de nos ter permitido aprender, na prática, interessantes conceitos relativos à construção de jogos.
Porém, para que nossa excêntrica aventura médica tenha começo, meio e fim, precisamos estruturar etapas de ligação entre os diferentes módulos desenvolvidos. Basicamente, por meio de codificação de scripts e configuração de elementos em cena, precisamos permitir a execução da seguinte sequência de estados:
Em relação ao diagrama, já trabalhamos na elaboração de algumas das “caixinhas” apresentadas, como, por exemplo, as que representam a passagem de tempo, a busca de pílulas de saúde pelo cenário e, de forma parcial, a administração de medicamentos para o tratamento.
Pensando na elaboração do game como um todo, começaremos hoje a aperfeiçoar a estrutura de scripts controladores de fases para que a parte inicial da sequência de estados possa ocorrer de fato, permitindo que haja o primeiro contato do médico com seu paciente e o subsequente diagnóstico de quais pílulas Doutor Tratanildo deverá coletar para tratar o enfermo ali presente.
Vamos começar nossas intervenções abrindo 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 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 realizarmos sua edição no Visual Studio.
Editando o controlador de fases
Embora já tenhamos uma boa quantidade de variáveis declaradas na porção inicial do código de ControllerFase, necessitaremos realizar algumas adições à listagem, visto que precisaremos indicar ao game informações importantes para a correta exibição do paciente na etapa inicial do fluxo de estados, como, por exemplo, qual objeto representará o paciente durante sua entrada no consultório e quais serão as posições no cenário às quais ele se dirigirá no deslocamento entre a porta e o centro do consultório.
Dentro do bloco de declaração de variáveis “Elementos da cena (Canvas + Laboratório)”, logo após a linha em que constam as variáveis referentes ao médico (doutorCenario, doutorConversa, etc.), adicione a seguinte linha de código:
public GameObject pacienteCenario, pacienteNoLeito;
Ainda no mesmo bloco de declaração de variáveis, adicione a seguinte linha de código após a declaração de camerasTratamento:
public Camera camPosicaoInicialPaciente, camDialogoPacienteDoutor, camPacienteIndoAoLeito;
As variáveis acrescidas ao código serão responsáveis por indicar ao game quais são os objetos que representam o paciente em suas diferentes situações, além das câmeras que deverão ser ativadas em três momentos distintos da fase:
- camPosicaoInicialPaciente: paciente chegando ao consultório;
- camDialogoPacienteDoutor: paciente conversando com Tratanildo;
- camPacienteIndoAoLeito: paciente caminhando em direção ao leito.
Além das variáveis recém-inseridas no corpo do script, acrescente as seguintes linhas de código entre a declaração da variável controladorLabirinto e a função void Start():
// Elementos de referência adicionais para construção das fases
public Material[] estilosVisuaisPacientes;
public Vector3 posicaoInicialPaciente, posicaoDialogoPaciente, posicaoPacienteIndoAoLeito;
public Vector3 rotacaoInicialPaciente, rotacaoDialogoPaciente, rotacaoPacienteLeito;
O vetor de materials estilosVisuaisPacientes que declaramos permitirá realizarmos alterações visuais ao modelo tridimensional do paciente, por meio da alteração dos materials utilizados nos componentes subordinados a seus GameObjects. Isso será útil para que possamos definir diferentes tipos de pacientes a cada fase do game.
Já as variáveis de tipo Vector3 permitirão indicarmos posteriormente ao game as localizações nas quais o objeto que representa o paciente no cenário deverá se posicionar nas diferentes etapas do fluxo de estados, assim como sua rotação, por meio de alterações nos atributos transform.localPosition e transform.localEulerAngles de seu GameObject.
Feitas as declarações das variáveis, iremos acrescentar o seguinte trecho de código ao final do script, mais especificamente antes do último fechamento de chaves do arquivo, após o conteúdo e as chaves de void Update():
public void AtenderPaciente()
{
// Ativações e desativações
doutorCenario.SetActive(false);
doutorTratamento.SetActive(false);
doutorFelicidade.SetActive(false);
doutorTristeza.SetActive(false);
pacienteNoLeito.SetActive(false);
// Troca a textura dos personagens, para corresponder ao estilo escolhido
foreach (SkinnedMeshRenderer texturaMeshPacCenario in pacienteCenario.GetComponentsInChildren<SkinnedMeshRenderer>(true))
texturaMeshPacCenario.materials[0] = estilosVisuaisPacientes[TipoPaciente[faseCorrente]];
foreach (SkinnedMeshRenderer texturaMeshPacLeito in pacienteNoLeito.GetComponentsInChildren<SkinnedMeshRenderer>(true))
texturaMeshPacLeito.materials[0] = estilosVisuaisPacientes[TipoPaciente[faseCorrente]];
//Ativa o paciente e o doutor da primeira cutscene
pacienteCenario.transform.localPosition = posicaoInicialPaciente;
pacienteCenario.transform.localEulerAngles = rotacaoInicialPaciente;
doutorConversa.SetActive(true);
pacienteCenario.SetActive(true);
}
A função AtenderPaciente() será responsável por realizar ações iniciais importantes para que Tratanildo inicie o atendimento a um paciente, tais como:
- Desligamento dos GameObjects que representam o médico no cenário durante diferentes situações, como em processo de tratamento ou ao se finalizar uma partida;
- Modificação das texturas dos objetos que representam o paciente para as armazenadas no vetor de variáveis estilosVisuaisPacientes, correspondendo ao tipo de paciente para a fase em questão;
- Posicionamento adequado do GameObject do paciente em cena;
- Ativação dos objetos que representam o médico e o paciente, após a realização das configurações devidas.
Especificamente sobre as alterações dos materials, perceba que realizamos as trocas para todos os objetos subordinados a pacienteCenario e a pacienteNoLeito. Isso deve-se a uma especificidade do modelo do paciente, cuja aplicação de materials ocorre individualmente para o corpo, a cabeça e os membros de seu GameObject, conforme podemos verificar na imagem de exemplo a seguir:
Por fim, altere o conteúdo entre as chaves de void Start() para que o novo método seja executado ao se iniciar a partida, trocando o código existente no momento pelo descrito a seguir:
Geral.ModoDeJogoCorrente = "Consultorio";
faseCorrente = 0;
AtenderPaciente();
Com essas alterações, já teremos uma estrutura mais robusta para que as etapas iniciais do game possam ser executadas de forma adequada.
Salve o script e feche o Visual Studio. Ao retornar ao editor do Unity, 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
Iniciamos hoje o processo de construção de nosso game como uma experiência única, conectando os mais diferentes módulos que desenvolvemos até o momento.
Aos poucos, iremos implementando sequencialmente as atividades que serão realizadas nas mais diferentes etapas da aventura, visando contemplar, em nosso projeto, todos os estados e transições previstos. Trabalhando juntos, logo teremos nosso jogo completo. Portanto, vamos perseverar e seguir em frente!
Nosso próximo texto já encontra-se disponível, continue conosco nessa jornada de conhecimento e fique ligado sempre aqui no GameBlast!
Revisão: Ives Boitano