Caso esta seja a primeira vez que você lê um texto de nossa série, aproveite para juntar-se a nós em uma divertida caminhada de experimentações e aprendizados sobre o universo do desenvolvimento de jogos.
Por meio do uso da plataforma Unity, estamos aprendendo variados conceitos sobre programação de games; e, para isso, estamos “colocando a mão na massa” na elaboração de diferentes projetos práticos.
No momento, estamos trabalhando no projeto do game Consultório do Dr. Tratanildo: trata-se de um puzzle ambientado em um consultório médico tridimensional cujas características de gameplay mesclam aspectos presentes em diferentes clássicos dos anos 1980 e 1990, tais como Dr. Mario (Nintendo, 1990) e Pac-Man (Namco, 1980).
Nossa série é desenvolvida especialmente para quem não teve a oportunidade prévia de aprender conceitos técnicos sobre programação de jogos, mas que tem vontade de tirar do papel aquela aventura digital que sempre sonhou em tornar realidade.
A partir do primeiro texto da série, abordamos desde a instalação e a configuração da ferramenta Unity em nossos computadores até aspectos específicos do processo de criação de jogos digitais, como a organização interna dos elementos presentes em um projeto, a inserção e a configuração de itens multimídia, tais como imagens e sons, e a codificação das regras do jogo e das interações entre os objetos de uma cena.
Aproveite esta oportunidade e venha conosco para que possamos, juntos, seguir nesta trilha rumo a novos conhecimentos!
Caracterização dos pacientes
Em nosso projeto, estamos utilizando um modelo único para a representação dos pacientes que irão ser tratados por Tratanildo Doencita. Porém, pelos scripts que codificamos e os elementos que configuramos, já sabemos que utilizaremos mais de um tipo de paciente em cena.
A diferenciação entre os diversos tipos de paciente será determinada por dois conjuntos de variáveis presentes no componente Controller Fase: Tipo Paciente e Estilos Visuais Pacientes.
Por enquanto, nenhum dos vetores de variáveis recebeu valores atrelados a si. Começaremos as intervenções de hoje modificando esse quadro, para que possamos, posteriormente, testar essa nova funcionalidade do game.
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 editor, na aba Project, abra a pasta Assets, Scenes e, por fim, clique duas vezes no ícone da cena ConsultorioScene.
Inicialmente, via aba Project, abra as pastas Assets, Multimidia, 3D, Pacientes, Materiais_personagens e, por fim, Advanced. Dentro de sua estrutura, encontraremos materials e texturas que representam possíveis visualizações para as diferentes partes dos corpos dos pacientes:
Especificamente sobre o modelo que estamos utilizando como base para a construção do paciente, a aplicação dos materials pode ser realizada separadamente para cada parte de seu corpo, por ter sido construído de forma modular. Porém, para simplificar, iremos adotar o “conjunto completo” de representações visuais dos materials para o corpo inteiro do paciente.
Agora, via aba Hierarchy, selecione o GameObject ControladorFase. Na aba Inspector, procure pelo elemento Estilos Visuais Paciente, preenchendo o campo de tamanho do vetor presente à sua direita com o valor 8:
Após a inserção do valor, para cada uma das novas entradas de valores apresentadas logo após Estilos Visuais Paciente, preencha conforme indicado a seguir, seja clicando e arrastando os materials correspondentes da aba Project em direção aos respectivos campos em Inspector, seja por meio da janela de seleção, clicando na bolinha ao lado direito de cada campo:
- Element 0: material de nome skin_adventurer;
- Element 1: material de nome skin_man;
- Element 2: material de nome skin_manAlternative;
- Element 3: material de nome skin_orc;
- Element 4: material de nome skin_robot;
- Element 5: material de nome skin_soldier;
- Element 6: material de nome skin_woman;
- Element 7: material de nome skin_womanAlternative.
Parâmetros adicionais
Ainda na aba Inspector, na porção superior da lista de parâmetros de Controller Fase, modifique os valores dos atributos dos parâmetros, conforme indicação a seguir:
- Tipo Paciente: conceda o valor 1 ao campo de tamanho do vetor, presente à direita do item;
- Element 0: conceda o valor 0 ao campo;
- Fala Paciente: conceda o valor 1 ao campo de tamanho do vetor, presente à direita do item;
- Element 0: insira o texto “Testando fala de personagem: 123” no campo, sem as aspas;
- Fala Doutor: conceda o valor 1 ao campo de tamanho do vetor, presente à direita do item;
- Element 0: insira o texto “Testando fala doutor: 456” no campo, sem as aspas.
Por fim, na porção inferior da mesma lista de parâmetros, serão os indicados a seguir a receber intervenções em relação a seus valores:
- Posicao Inicial Paciente: X = 26, Y = 0, Z = 5;
- Posicao Dialogo Paciente: X = 5.25, Y = 0, Z = 4;
- Posicao Paciente Indo Ao Leito: X = 9, Y = 0, Z = -17;
- Rotacao Inicial Paciente: X = 0, Y = -90, Z = 0;
- Rotacao Dialogo Paciente: X = 0, Y = -110, Z = 0;
- Rotacao Paciente Leito: X = 0, Y = -230, Z = 0.
As variáveis que receberam os valores indicados servirão de referência para que o jogo saiba o posicionamento inicial e a rotação do GameObject que representa o paciente ao surgir no cenário e, também, as coordenadas posteriores de rotação e posicionamento que o objeto adotará ao caminhar pelo cenário em direção ao leito.
Que tal darmos uma olhada em como está ficando a etapa inicial de nosso jogo? Para tal, mude a visualização para a aba Game e clique sobre o ícone do botão Play.
Corrigindo o código
Em princípio, podemos perceber que a câmera correta foi ativada, o objeto representante de Doutor Tratanildo também surge na posição adequada, assim como o GameObject representante do paciente, que ainda não se movimenta pelo cenário pois ainda não implementamos essa funcionalidade. Entretanto, algo de errado está ocorrendo no momento, pois a representação visual do paciente não foi alterada para a que configuramos.
O primeiro elemento numérico de Tipo Paciente é 0, e o item Element 0 de Estilos Visuais Pacientes recebeu referência do material skin_adventurer:
Se voltarmos à pasta que armazena os materials e texturas dos pacientes, via aba Project, perceberemos que skin_adventurer não é o mesmo material aplicado ao modelo do paciente, que se assemelha muito mais a skin_womanAlternative.
Tudo indica que, apesar de termos indicado via script a necessidade de alteração do material dos elementos individuais dos modelos dos pacientes, essa alteração não está ocorrendo de fato. Vamos corrigir essa situação, por meio de uma intervenção pontual no script ControllerFase.
Interrompa a simulação da execução, clicando novamente sobre o ícone do botão Play e retornando à aba Scene. Na aba Project, abra a pasta Assets e, em seguida, Scripts. Clique duas vezes sobre ControllerFase para realizarmos edições em seu conteúdo no Visual Studio.
Ao inserirmos anteriormente códigos para a troca da textura dos objetos subordinados aos GameObjects que representam o paciente, solicitamos a mudança de um material em específico (materials[0]) no vetor de materials de cada elemento.
Porém, ao realizarmos essa modificação pontual, na verdade acabamos não aplicando intervenções no elemento “real” do vetor, mas sim a uma cópia de materials[0] gerada pelo Unity naquele momento.
Para que as alterações sejam aplicadas de forma consistente sobre o GameObject representante do paciente, devemos criar um novo vetor de materials, adicionar um elemento a ele na posição [0] apontando para o material que desejamos e, por fim, trocar o vetor antigo dos elementos subordinados aos objetos do paciente pelo novo vetor.
Pode parecer algo contraintuitivo, mas o fornecimento de uma “cópia simples” de um material em utilização é uma forma de o Unity preservar os níveis de performance para a renderização dos objetos em cena. Ao trocarmos explicitamente o vetor de materials, não terá jeito: o Unity vai ter de atualizar a representação gráfica do elemento com as novas diretrizes.
Dentro do conteúdo de AtenderPaciente, substitua o bloco de código referente à troca de textura dos personagens para o descrito a seguir:
// Troca a textura dos personagens, para corresponder ao estilo escolhido
Material[] mat = new Material[1];
mat[0] = estilosVisuaisPacientes[TipoPaciente[faseCorrente]];
foreach (SkinnedMeshRenderer texturaMeshPacCenario in pacienteCenario.GetComponentsInChildren<SkinnedMeshRenderer>(true))
texturaMeshPacCenario.materials = mat;
foreach (SkinnedMeshRenderer texturaMeshPacLeito in pacienteNoLeito.GetComponentsInChildren<SkinnedMeshRenderer>(true))
texturaMeshPacLeito.materials = mat;
Salve o script e retorne ao Unity. Novamente, vamos experimentar a execução do game (aba Game, ícone do botão Play) para vermos se a alteração dinâmica da representação visual do paciente vai ocorrer:
Pois é, agora o paciente correto surgiu na posição inicial determinada. Interrompa a simulação, clicando novamente sobre o ícone do botão Play e voltando à aba Scene. 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
Aos poucos, por meio da elaboração das etapas sequenciais de interação entre paciente e médico, vamos percebendo o game tomar forma.
Nos próximos encontros, vamos configurar e ativar a movimentação do paciente pelo cenário em direção ao leito, além de configurar os parâmetros do tratamento para cada paciente a ser atendido.
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