Aprendendo a programar jogos em Unity: iniciando a construção da sequência de ações do game

A partir dos módulos do game que desenvolvemos, começaremos a construir cadeias de interações entre elementos para formar as fases do jogo.

Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Após concluirmos, no encontro anterior, a codificação de importantes aspectos do sistema de coleta dos medicamentos presentes no cenário, iremos aproveitar toda a experiência que adquirimos até o momento para começar a estruturar a sequência definitiva de ações entre os mais diferentes entes presentes em nosso game, transformando as diferentes atividades desenvolvidas de forma separada em uma aventura coesa e interligada.

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
Siga o Blast nas Redes Sociais
Rodrigo Garcia Pontes
Entendo videogames como sendo uma expressão de arte e lazer e, também, como uma impactante ferramenta de educação. No momento, doutorando em Sistemas da Informação pela EACH-USP, desenvolvendo jogos e sistemas desde 2020. Se quiser bater um papo comigo, nas redes sociais procure por @RodrigoGPontes.
Este texto não representa a opinião do GameBlast. Somos uma comunidade de gamers aberta às visões e experiências de cada autor. Você pode compartilhar este conteúdo creditando o autor e veículo original (BY-SA 3.0).