Aprendendo a programar jogos em Unity: ajustes finais na composição do segundo estágio

Finalizaremos agora a montagem da segunda fase de nosso game, abrindo os caminhos para iniciar a conclusão desta aventura.

em 27/02/2024
Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Dando sequência ao processo de desenvolvimento do nosso primeiro platformer 2D, hoje iremos concluir as alterações que iniciamos no projeto em relação à elaboração do segundo estágio da aventura.


Caso seja a primeira vez que você acessa nossa série, aproveite e junte-se a nós nesta grande jornada de aprendizado. Por meio da realização de diferentes atividades práticas, você terá a oportunidade de conhecer mais sobre o processo de criação de jogos utilizando a ferramenta Unity.

Desde o primeiro tópico da trilha de aprendizado, você poderá “colocar a mão na massa” e aprender a criar os mais diversos tipos de games: após instalarmos e configurarmos a ferramenta, juntos codificaremos scripts, comporemos e posicionaremos os elementos das cenas dos jogos e, por fim, criaremos aventuras e desafios “da pesada”.

Por falar em desafios “da pesada”, no momento estamos desenvolvendo justamente o jogo Motorista da Pesada, um platformer 2D cujo objetivo proposto ao gamer é a coleta, no menor tempo possível, de diversas caixas de presente espalhadas pelos caminhos presentes nas fases. Para isso, o jogador deverá guiar um simpático carrinho, tomando muito cuidado com as perigosas bombas que foram espalhadas pelos cenários e, também, com a implacável e constante contagem regressiva do cronômetro.

No tópico anterior de nossa jornada realizamos extensas alterações no script responsável pelo controle do pulo de nosso personagem principal, para que nosso simpático colega motorizado possa saltar tranquilamente em plataformas inclinadas, como as que inserimos em nosso segundo estágio. 

Agora, estamos a poucos passos de finalizar nosso segundo estágio e partirmos para a composição da derradeira fase de nossa aventura. Venha conosco e vamos juntos nesta jornada rumo a novos conhecimentos!

Coletáveis variados

Após realizarmos os ajustes necessários para garantir um bom funcionamento de nosso jogo em circunstâncias diferentes das apresentadas no primeiro estágio, vamos dar atenção agora a pequenos aspectos visuais e sonoros que podem enriquecer o processo de imersão do gamer na aventura.

Como foi sugerido anteriormente ao concluirmos a composição dos elementos da primeira fase, que tal trocarmos os sprites de alguns dos presentes espalhados pela fase, a fim de aumentar a variedade visual do desafio na tela?

Vamos abrir nosso projeto no editor para continuarmos o desenvolvimento do projeto. Abra o Unity Hub e clique duas vezes sobre o item referente ao projeto Motorista da Pesada. Na aba Project, abra a pasta Assets e, por fim, Scenes. Clique duas vezes sobre o ícone da cena Fase02 para iniciarmos sua edição.

Na aba Hierarchy, selecione alguns dos objetos que representam as caixinhas de presente coletáveis e altere o parâmetro Sprite de seus componentes do tipo Sprite Renderer. Como sugestão, realizei a alteração dos parâmetros dos seguintes GameObjects:
  • Coletavel02 e Coletavel03: sprite “presentes_2”;
  • Coletavel05 e Coletavel06: sprite “presentes_1”; e
  • Demais coletáveis: manter parâmetros sprite como “presentes_0”.
Simule a execução do game para ver as alterações gráficas em ação. Para isso, vá até a aba Game e pressione o botão Play. Perceba que, mesmo alterando os sprites, a animação que criamos anteriormente para os coletáveis continua respeitando o comportamento desejado:

Interrompa a simulação e volte à aba Scene para darmos prosseguimento às alterações finais da segunda fase.

Ajustando o ronco do motor

Anteriormente, realizamos ajustes via código para permitir que nosso carrinho pudesse realizar o efeito sonoro de aceleração de forma mais convincente, aumentando ou diminuindo seu “tom” de acordo com a movimentação realizada pelo veículo. Para isso, modificamos dinamicamente o parâmetro pitch do componente AudioSource, numa intervenção realizada pela execução de um trecho de código inserido no script MovFundo.

Apesar de ser um efeito sonoro bacana e que passa ao jogador uma sensação de aceleração condizente com o que se vê na tela, em determinados momentos da jogatina é interessante que seu som seja suprimido, sobretudo nos momentos em que a ação é interrompida. Em Motorista da Pesada, esses momentos ocorrem quando modificamos o valor do parâmetro Time.timeScale para zero, ou seja, ao pausarmos o game e, também, ao vencermos ou perdermos uma partida.

Sabendo disso, iremos criar um script que atualizará o volume de um AudioSource levando em consideração o valor de Time.timeScale. No editor do Unity, na aba Project, abra as pastas Assets e, em seguida, Scripts. Clique com o botão direito sobre uma área livre da pasta, selecione a opção Create e, por fim, C# Script.

Dê ao novo script o nome “AjusteVolumeSom”, sem as aspas. Clique duas vezes sobre seu ícone para abrirmos o script para edição no Visual Studio.

Vamos declarar a variável volumeInicial, que será responsável por armazenar o nível inicial (referencial) de volume de um AudioSource. Para isso, antes da função void Start(), insira a seguinte linha de código:

    float volumeInicial;

Agora, dentro dos colchetes da função void Start(), iremos inserir a seguinte linha de código, responsável por armazenar em volumeInicial o valor inicial do parâmetro volume do componente AudioSource do objeto ao qual nosso script estará atrelado:

    volumeInicial = gameObject.GetComponent<AudioSource>().volume;

Por fim, dentro dos colchetes da função void Update(), insira a seguinte linha de código:

gameObject.GetComponent<AudioSource>().volume = volumeInicial * Time.timeScale;

Basicamente, a cada frame, o parâmetro volume do componente AudioSource será ajustado em relação a volumeInicial, multiplicado pelo Time.timeScale vigente.

Como em nosso projeto utilizamos apenas dois valores para Time.timeScale (0 para “partida pausada”, 1 para “partida em andamento”), o volume do componente AudioSource será correspondente ao seu valor de volume inicial, definido no editor do Unity, ou zero, ao se pausar o jogo, ganhar ou perder uma partida.

Salve o script, minimize o Visual Studio e volte ao editor do Unity. Na aba Hierarchy, selecione o GameObject Aceleracao. Na aba Inspector, insira para o objeto selecionado um novo componente do tipo Ajuste Volume Som, clicando sobre o botão Add Component, Scripts e, por fim, escolhendo a opção correspondente.

Experimente simular a execução do game, indo à aba Game e pressionando o botão Play. Veja que, ao pausar o jogo, não há mais a execução do som do motor em conjunto com a trilha sonora da fase. Após interromper a simulação, volte à aba Scene.

Clique sobre o menu File e, em seguida, na opção Save, para salvarmos as alterações que realizamos até aqui em Fase02. Agora, iremos ajustar o comportamento em questão também para o elemento Aceleracao de Fase01. Para isso, na aba Project, abra a pasta Assets e, por fim, Scenes. Clique duas vezes sobre o ícone da cena Fase01

Vale ressaltar que, se tivéssemos transformado Aceleracao em um prefab anteriormente (durante sua concepção, ainda em Fase01), esta etapa não seria necessária.

Selecione o objeto Aceleracao de Fase01 e realize a mesma ação de inserção do componente do tipo Ajuste Volume Som que realizamos para o objeto do segundo estágio.

Clique sobre o menu File e, em seguida, na opção Save, para salvarmos a nova alteração realizada.

Simule a execução do game e veja que, agora, o comportamento é uniforme: tanto na primeira quanto na segunda fase, ao se pausar o game, por exemplo, o som do motor é suprimido, ouvindo-se apenas a trilha sonora escolhida para aquela fase.

Transição entre fases

Ainda em Fase01, podemos perceber, por meio da simulação de execução, um comportamento a ser corrigido. Experimente vencer o primeiro estágio e clique sobre a opção “Avançar”:

Veja que, além de não haver transição entre as cenas, uma mensagem de erro é exibida na aba Console do editor:

Esse erro ocorre pois o Unity ainda não sabe que a cena Fase02 irá fazer parte da “lista definitiva” de cenas do game. Lembre-se de que podemos criar quantas cenas quisermos dentro de um projeto, o que é bem útil, por exemplo, para a elaboração de ideias e testes de cenários, na composição de personagens, de itens, dentre outros.

Dessa forma, assim como fizemos logo após concluirmos a criação da cena MenuInicial e iniciarmos a elaboração de Fase01, temos que indicar ao Unity quais cenas farão parte do conjunto do jogo incluindo agora Fase02.

Interrompa a simulação do game e, na aba Project, abra a pasta Assets e, em seguida, Scenes. Clique duas vezes sobre o ícone da cena Fase02 para voltarmos a abri-la. Clique no menu File e, em seguida, Build Settings...


Com a cena Fase02 aberta, na janela que for exibida (Build Settings), clique sobre o botão Add Open Scenes, conforme indicação a seguir:

Agora temos Fase02 incluída em nossa listagem de cenas, além das que foram anteriormente inseridas.

Feche a janela Build Settings e retorne à aba Scene de Fase02 para realizarmos um último ajuste.

Congelando a movimentação ao pausar

Retomando a análise de aspectos dos momentos em que a ação é interrompida, durante a execução dos testes de simulação, percebemos que, se o jogador pressionar as teclas que movimentam o carrinho, mesmo que o jogo esteja pausado, o sprite de nosso personagem principal será afetado, dando a impressão de que ele não está “tão pausado assim” quanto gostaríamos:

Para impedir esse pequeno movimento, que na verdade é um efeito de espelhamento de sprites que implementamos anteriormente, vamos modificar o código do script LadoCarrinho. Na aba Project, abra as pastas Assets, Scripts e, por fim, clique duas vezes sobre o ícone do referido script para que possamos realizar algumas alterações em seu conteúdo.

Vamos encapsular o código presente dentro dos colchetes da função void Update() em uma estrutura condicional que irá validar se a partida está pausada ou não.

Logo após a abertura do primeiro colchete da função void Update(), insira o seguinte código:

        if (Time.timeScale > 0)
        {

        }

Realoque o código presente anteriormente para dentro dos colchetes de if (Time.timeScale > 0). O conteúdo de void Update() ficará como o exemplo representado pela imagem a seguir:

Salve o script e minimize o Visual Studio. Volte ao editor do Unity e teste a execução para perceber que, agora, não temos mais movimentos nem sons indesejados durante a exibição das telas de pause, de vitória e de derrota das partidas.

Ao término da simulação de execução, salve a cena (menu File, Save) e o projeto (menu File, Save Project) antes de fechar o Unity.

Próximos passos

Enfim, concluímos a construção da segunda fase de Motorista da Pesada! Com a finalização do segundo estágio do game, estamos mais próximos do que nunca de termos elaborado por completo mais um game em nossa série. 

No próximo encontro, daremos início à construção do tão esperado terceiro estágio de nosso game, além de realizarmos mais ajustes e melhorias para deixar essa aventura cada vez mais especial e inesquecível.

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

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. Escrevemos sob a licença Creative Commons BY-SA 3.0 - você pode usar e compartilhar este conteúdo desde que credite o autor e veículo original.