Caso hoje seja a primeira vez que você acessa conteúdos de nossa série, sinta-se especialmente convidado a juntar-se a nós para aprendermos juntos conceitos e métodos aplicados ao desenvolvimento de jogos digitais. Por meio da elaboração de projetos práticos, vamos aprendendo diferentes técnicas e ferramentas que nos auxiliarão a tirar do papel games dos mais variados estilos gráficos e de gameplay.
Em nossa série, utilizamos a ferramenta Unity para nos auxiliar a desenvolver os projetos. Trata-se de um motor de jogo utilizado na elaboração de jogos diversos, tais como Cuphead, Super Bomberman R e Among Us. Os conceitos que vemos na série nos permitem aprender mais sobre como os jogos são elaborados, podendo ser aplicados posteriormente em nossos projetos pessoais.
A partir do primeiro texto da série, são abordados desde a instalação e a configuração da ferramenta em nossos computadores até os passos necessários para que, de fato, sejam tirados do papel os divertidos projetos que elaboramos, tais como a codificação de comportamentos e de regras, a configuração de elementos multimídia nos cenários dos jogos e a disposição de personagens, itens e adversários em cena.
Até o momento, já finalizamos a produção de duas aventuras digitais: Forest Ping Pong, uma “homenagem florestal” ao clássico dos arcades Pong (Atari, 1972), e Motorista da Pesada, um endless platformer cujas características de gameplay são inspiradas no arcade japonês City Connection (Jaleco, 1985). Atualmente, estamos elaborando o game Consultório do Dr. Tratanildo: trata-se de um puzzle ambientado em um consultório médico tridimensional, cujos desafios para sua elaboração nos permitem aprender conceitos interessantes, tais como os que envolvem a interação física entre elementos 3D no cenário e a disposição de câmeras em ângulos diversos. Vale a pena conferir o processo de elaboração dos games por meio do índice disponibilizado no primeiro texto da série.
Mesmo se você não tiver conhecimentos prévios sobre programação de jogos ou de sistemas, é possível aprender a elaborar seus próprios games. Em nossa série, os conceitos são abordados sempre por meio de exemplos replicáveis, que podem ser aplicados posteriormente nos projetos que vier a desenvolver por conta própria.
Se você gostou da ideia de criar seus próprios jogos, não perca mais tempo e junte-se a nós em uma divertida jornada de aprendizados, repleta de novos conhecimentos e de muita diversão!
Chega de vertigem!
Embora tenhamos conseguido implementar a câmera que fornecerá as imagens que serão exibidas no fundo do menu inicial, ajustes importantes têm de ser realizados, sobretudo em relação às (altas) rotações que seu GameObject apresenta no momento. Definitivamente, não queremos nenhum jogador de nossa aventura sofrendo com labirintites e vertigens por nossa culpa!
O primeiro passo envolverá a criação de um pequeno script, responsável por controlar a velocidade de execução da animação que implementamos. Para tal, vamos abrir o projeto para edição: no Unity Hub, clique duas vezes sobre o item referente a ele. 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 com o botão direito sobre uma área vazia da pasta, no menu suspenso apresentado, selecione a opção Create e, em seguida, C# Script. Conceda o nome “AjusteVelocidadeAnimacaoLegacy” ao novo script criado. Clique duas vezes sobre seu ícone para iniciarmos a edição de seu conteúdo no Visual Studio.
Substitua o conteúdo interno presente entre as chaves de AjusteVelocidadeAnimacaoLegacy (incluindo a declaração das funções Start e Update) pelas linhas de código dispostas a seguir:
public float velocidade = 1f;
private void OnEnable()
{
foreach (AnimationState state in gameObject.GetComponent<Animation>())
state.speed = velocidade;
}
O código recém-introduzido é responsável por ajustar a velocidade de execução de animações legadas, como é o caso da que implementamos para a câmera giratória. Note que o ajuste do atributo speed é aplicado a todas as animações atreladas ao componente Animation, o que é útil em casos em que o objeto tenha mais de uma animação previamente configurada atrelada a si.
Salve o script, minimize o Visual Studio e retorne ao editor do Unity. Na aba Hierarchy, localize o objeto CameraMenuInicial, subordinado a Cameras, e selecione-o. Na aba Inspector, por intermédio do botão Add Component, atrele ao objeto um novo componente do tipo Ajuste Velocidade Animacao Legacy, concedendo o valor 0.05 para seu componente Velocidade, conforme exemplificado pela imagem a seguir:
Para que não precisemos desativar MenuInicial novamente a fim de visualizarmos se a câmera está se comportando adequadamente, vamos aproveitar o momento para realizar ajustes relacionados aos demais elementos do referido menu.
Via aba Hierarchy, selecione MenuInicial, subordinado a Canvas. Na aba Inspector, dirija-se a seu componente Image e altere o valor do atributo Color para a cor que apresente parâmetros R, G, B = 255 e A = 25.
Se testarmos agora a execução do jogo, indo à aba Game e clicando sobre o ícone do botão Play, notaremos que houve uma melhora substancial na movimentação da câmera e na apresentação do menu, porém, ainda necessitando de ajustes relacionados à ordem de execução das atividades do jogo, conforme ilustração a seguir:
Um menu parcialmente funcional
A velocidade da câmera de fundo do menu já está ajustada, porém, o jogo não deve ser iniciado antes de se clicar sobre o botão “Iniciar partida”, como pudemos notar pelo exemplo anterior. Teremos, então, de realizar ajustes sobre o script controlador das fases, para que ele possa respeitar o estado em que o jogo ainda não foi iniciado.
Interrompa a simulação da execução, clicando novamente sobre o ícone do botão Play e retornando à aba Scene. Volte à aba Project e, ainda com a pasta Scripts em evidência, clique duas vezes sobre o ícone que representa o script ControllerFase para que possamos editar seu conteúdo.
A primeira intervenção que realizaremos será sobre o conteúdo do método Start. Substituiremos as seguintes linhas de código:
Geral.ModoDeJogoCorrente = "Consultorio";
faseCorrente = 0;
AtenderPaciente();
Troque-as pelos comandos descritos a seguir:
Geral.ModoDeJogoCorrente = "Menu";
faseCorrente = -1;
A alteração realizada envolve indicarmos ao jogo que o estado inicial do game, representado pela variáveis ModoDeJogoCorrente, é a exibição do menu; não há uma fase corrente sendo jogada no momento (por isso, o valor concedido é -1); e ainda não é momento para serem iniciadas as rotinas codificadas na função AtenderPaciente, justamente pelo desafio ainda não ter sido iniciado.
Em seguida, na seção referente à declaração de variáveis, localize a seguinte linha de código:
//public Camera camPosicaoInicialPaciente, camDialogoPacienteDoutor, camPacienteIndoAoLeito;
Substitua-a pela descrita a seguir:
public Camera camPosicaoInicialPaciente, camDialogoPacienteDoutor, camPacienteIndoAoLeito, camMenuInicial;
Note a presença de uma nova variável, camMenuInicial. Ela será importante para que, ao se iniciar o desafio, o jogo saiba qual câmera deve ser desativada antes de se iniciar a sequência de diálogos entre o médico e seus pacientes.
Por fim, dentro do bloco de códigos do método AtenderPaciente, na seção reservada às ativações e desativações de objetos, imediatamente antes do comando para ativação de camPosicaoInicialPaciente, inclua a seguinte linha de comando:
camMenuInicial.gameObject.SetActive(false);
Com esse comando, a câmera rotativa do menu inicial será desativada, assim que AtenderPaciente for acionado.
Salve o script, feche o Visual Studio e retorne ao editor do Unity para os ajustes finais de nosso encontro de hoje.
Na aba Hierarchy, selecione o GameObject ControladorFase. Na aba Inspector, dentro da lista de atributos do componente Controller Fase, localize a entrada correspondente a Cam Menu Inicial. Conceda o valor correspondente ao objeto CameraMenuInicial ao atributo, assim como exemplificado pela imagem a seguir:
Em seguida, volte à aba Hierarchy e localize o objeto BotaoIniciarPartida, subordinado a Opcoes que, por sua vez, encontra-se subordinado a MenuInicial. Na aba Inspector, vamos intervir sobre o comportamento On Click de seu componente Button. Inicialmente, vamos clicar por duas vezes sobre o ícone com o sinal de “mais” (+), indicado em laranja na imagem a seguir.
Na primeira entrada referente às ações a serem realizadas quando o botão de início de partida for clicado, abaixo de Runtime Only, clique sobre o campo e selecione ControladorFase, conforme exemplo a seguir:
Referente à segunda entrada de On Click, abaixo de Runtime Only, clique sobre o campo e selecione MenuInicial. Do lado direito de Runtime Only, selecione GameObject, em seguida, SetActive e, por fim, deixe a caixa de seleção que aparecer abaixo da caixa de seleção vazia, conforme exemplificado a seguir:
Com essas alterações, ao se clicar o botão de início de partida, além do menu ser ocultado, o jogo dará início aos processos para reprodução da primeira partida do jogo, mesmo sendo acionada a função AvancarProximaFase. Isso deve-se ao fato de termos determinado, via código, que a fase atual seria a “fase -1”, e, ao solicitarmos ao jogo para que seja executada a próxima fase, de fato a primeira fase será carregada (de índice = 0), e as rotinas iniciais do jogo seguirão o curso natural esperado.
Experimente executar novamente a simulação do game para ver as alterações realizadas na prática, indo à aba Game e clicando sobre o ícone do botão Play.
Ao término da simulação de execução, clique novamente sobre o ícone do botão Play e retorne à 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 Unity.
Próximos passos
Após as intervenções realizadas nos dois últimos encontros, já temos uma parte importante do menu inicial implementada, de forma a permitir que o jogo seja iniciado de forma simples e direta.
Em nossos próximos encontros, retomaremos o processo de ajustes voltados tanto ao núcleo quanto ao consultório do game, além de implementarmos as demais telas do menu inicial.
Nosso próximo encontro será no dia 12 de abril. Até mais! Fique sempre ligado nas novidades do GameBlast!
Revisão: Ives Boitano



















