Se hoje for a primeira vez que você está acessando textos de nossa série, sinta-se especialmente convidado(a) a nos acompanhar em uma divertida jornada de aprendizado prático sobre o universo do desenvolvimento de jogos digitais. Por meio do desenvolvimento de projetos práticos de programação, descobriremos a cada encontro um pouco mais sobre como a ferramenta Unity pode nos auxiliar a criarmos nossos próprios games.
Em nossos textos, são abordados tópicos importantes do processo de desenvolvimento de um jogo, tanto aqueles relacionados à elaboração e configuração de personagens, de cenários e de elementos multimídia nas fases, quanto os referentes à programação de comportamentos, de regras e de interações entre os diferentes componentes de uma aventura.
No momento, estamos no processo de produção do game Consultório do Dr. Tratanildo. Trata-se de um puzzle ambientado em um consultório médico 3D, cujo enredo gira em torno do excêntrico médico Tratanildo Doencita e de suas miraculosas pílulas coloridas, prontas a serem utilizadas para combater os mais diversos males que estão acometendo os pacientes do universo virtual.
Fique tranquilo caso você não tenha tido experiências prévias de programação de jogos ou de sistemas, pois nossa série é preparada de forma a permitir a todos que tenham vontade tirarem do papel os games que sempre sonharam em ver se tornarem realidade.
A partir do primeiro texto da série, são abordadas desde as etapas iniciais do processo, como os passos necessários para a instalação e a configuração da ferramenta em nossos computadores, até as fases em que é colocada a mão na massa pra valer, codificando e configurando os projetos de diferentes jogos que são propostos.
Então, o que você acha de seguir conosco nesta jornada rumo a um universo de novos conhecimentos? Se gostou, aperte os cintos e vamos, juntos, desvendar novos conhecimentos, nos divertindo bastante durante o processo.
Mais dinamicidade aos agentes de doenças
Voltando nossas atenções ao módulo responsável pela gestão dos elementos do labirinto, iremos nos dedicar agora a aprimorar o comportamento dos agentes de doenças. Embora já tenhamos codificado a interação entre os monstrinhos e as pílulas miraculosas, seria bem interessante permitir que eles possam caminhar pelos labirintos de forma dinâmica, de forma semelhante ao visto em jogos como Pac-Man (Namco, 1980):
Como, em nosso projeto, dispomos de cinco variações dos agentes de doenças, é interessante definirmos antes da codificação dos scripts controladores como cada tipo de agente reagirá assim que der de encontro com um obstáculo, seja ele uma parede ou mesmo outro monstrinho presente nos corredores do labirinto.
Considerando que um agente encontre um obstáculo em seu caminho, esta será a sequência de mudanças de direcionamento que cada tipo tentará realizar para continuar em movimento pelas rotas do labirinto:
- Agente verde: Norte, Sul, Leste, Oeste;
- Agente vermelho: Norte, Oeste, Leste, Sul;
- Agente amarelo: Norte, Leste, Oeste, Sul;
- Agente azul: Norte, Oeste, Sul, Leste;
- Agente roxo: Norte, Sul, Oeste, Leste.
Tomando um monstrinho verde como exemplo, se ele estiver rumando ao sul do labirinto e topar com uma parede ou com outro agente, ele tentará realizar um desvio tomando o caminho sentido leste; caso não seja possível, ele tentará seguir caminhando a oeste e, em último caso, prosseguirá em sentido ao norte.
Para que esse tipo de comportamento ocorra de fato, necessitaremos, inicialmente, realizar intervenções nos códigos do controlador responsável pelos comportamentos dos agentes de doenças. Para tal, vamos abrir nosso 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 ComportamentoDoenca, para iniciarmos as intervenções que iremos realizar em seu conteúdo no Visual Studio.
A primeira intervenção que iremos realizar sobre o script controlador dos agentes de doenças refere-se à inserção de algumas variáveis importantes para o processo de controle da movimentação dos monstrinhos pelo cenário. Logo após a linha de código com as declarações sobre o tipo do agente em questão (isVerde, isVermelho, etc.), insira o conteúdo descrito a seguir:
public float fatorDeslocamento;
public bool liberadoCaminhada = false;
private char direcaoCaminhada = 'S';
private bool emProcessoDeMudancaDeRota = false;
A seguir, a utilidade de cada variável recém-declarada é detalhada:
- Por meio da variável fatorDeslocamento, será possível determinarmos diferentes fatores de velocidade para o deslocamento dos agentes de doenças pelo cenário;
- O valor da variável liberadoCaminhada determinará ao código que inseriremos em breve se, naquele momento, o monstrinho em questão poderá se deslocar pelo cenário ou não;
- A variável direcaoCaminhada armazenará o sentido ao qual o agente estará se deslocando no momento;
- Por meio de emProcessoDeMudanca, será possível sabermos se o agente está em processo de modificação do sentido ao qual ele normalmente se deslocará durante a fase.
Agora, dentro da estrutura de códigos da função OnTriggerEnter, iremos acrescentar novas condições ao bloco de decisão de switch (other.tag). Insira o código a seguir logo após o trecho responsável pela definição do que ocorre com medicamentos roxos:
case "parede":
case "agenteDoenca":
liberadoCaminhada = false;
break;
Tanto nos casos em que o agente de doenças acabar esbarrando em paredes quanto ao encontrar outros agentes dentro do labirinto, a variável receberá o valor falso (false), o que permitirá, em breve, tomarmos decisões a respeito de alterações no sentido ao qual o monstrinho colorido estará se deslocando dentro do corpo do paciente.
Funções de rotação e de caminhada
Após a intervenção realizada, insira o código a seguir imediatamente antes do último fechamento de chaves do arquivo (logo após TratamentoErrado). O código será responsável por permitir a rotação do agente, dependendo do sentido ao qual ele irá transitar no momento:
private void RotacionarAgente()
{
switch (direcaoCaminhada)
{
case 'N':
gameObject.transform.localEulerAngles = new Vector3(0, 90, 0);
break;
case 'S':
gameObject.transform.localEulerAngles = new Vector3(0, 270, 0);
break;
case 'L':
gameObject.transform.localEulerAngles = new Vector3(0, 180, 0);
break;
case 'O':
gameObject.transform.localEulerAngles = new Vector3(0, 0, 0);
break;
}
}
Logo após o código inserido, iremos introduzir a função responsável pela execução da caminhada. Esse deslocamento respeitará a taxa definida por fatorDeslocamento. Seu código é o descrito a seguir:
private void CaminharAgente()
{
switch (direcaoCaminhada)
{
case 'N':
gameObject.transform.localPosition += new Vector3(Time.deltaTime * fatorDeslocamento, 0, 0);
break;
case 'S':
gameObject.transform.localPosition -= new Vector3(Time.deltaTime * fatorDeslocamento, 0, 0);
break;
case 'L':
gameObject.transform.localPosition -= new Vector3(0, 0, Time.deltaTime * fatorDeslocamento);
break;
case 'O':
gameObject.transform.localPosition += new Vector3(0, 0, Time.deltaTime * fatorDeslocamento);
break;
}
}
Em seguida, configuraremos a Coroutine que será responsável pela mudança de rumo, nos momentos em que o agente de doenças encontrar um obstáculo pelo caminho.
O código foi implementado como um Coroutine para permitir que haja dois tempos de espera, de 0,25 segundo cada, a serem respeitados antes e depois da efetivação da mudança de rota do monstrinho no labirinto.
private IEnumerator MudarRota()
{
yield return new WaitForSeconds(0.25f);
switch (direcaoCaminhada)
{
case 'N':
if (isVerde || isRoxo) direcaoCaminhada = 'S';
if (isAmarelo) direcaoCaminhada = 'L';
if (isVermelho || isAzul) direcaoCaminhada = 'O';
break;
case 'S':
if (isVerde || isAzul) direcaoCaminhada = 'L';
if (isRoxo) direcaoCaminhada = 'O';
if (isVermelho || isAmarelo) direcaoCaminhada = 'N';
break;
case 'L':
if (isVerde || isAmarelo) direcaoCaminhada = 'O';
if (isAzul || isRoxo) direcaoCaminhada = 'N';
if (isVermelho) direcaoCaminhada = 'S';
break;
case 'O':
if (isVerde) direcaoCaminhada = 'N';
if (isAmarelo || isAzul) direcaoCaminhada = 'S';
if (isVermelho || isRoxo) direcaoCaminhada = 'L';
break;
}
RotacionarAgente();
yield return new WaitForSeconds(0.25f);
emProcessoDeMudancaDeRota = false;
liberadoCaminhada = true;
}
É importante notar que, dentro da estrutura de decisão switch (direcaoCaminhada), está codificada a sequência de mudanças para a rotação dos agentes de doenças, respeitando a sequência definida para cada tipo específico de doença presente no jogo.
Por fim, após o fechamento das chaves de MudarRota, vamos reintroduzir o método Update para esse script, desta vez com comandos que permitirão chamadas às funções recentemente implementadas no arquivo nos momentos adequados:
private void Update()
{
if (liberadoCaminhada)
CaminharAgente();
else
if (!emProcessoDeMudancaDeRota)
{
emProcessoDeMudancaDeRota = true;
StartCoroutine(MudarRota());
}
}
Note que será por meio do método Update que o script induzirá o agente de doenças a caminhar ou a mudar sua direção, dependendo dos valores das variáveis introduzidas no encontro de hoje.
Após a realização de tantas intervenções, 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 fechá-lo.
Próximos passos
Iniciamos, hoje, a construção de novas configurações que permitirão, em breve, observarmos melhorias em relação ao comportamento dos agentes de doenças dentro do labirinto. Embora tenhamos codificado uma quantidade considerável de comandos dentro do script controlador dos monstrinhos, ainda são necessários ajustes, tanto a nível de código quanto em configurações de componentes e de GameObjects, para que possamos ver o fruto de nossas intervenções.
Em nosso próximo encontro, daremos sequência à elaboração dessa nova funcionalidade, realizando os ajustes necessários para podermos observar melhorias significativas no módulo de controle do labirinto.
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













