Seja bem-vindo(a) ao GameDev: Aprendendo a programar jogos em Unity de hoje! Dando continuidade a nossa trilha de aprendizado, iremos hoje iniciar a criação de um novo jogo 2D, desta vez do gênero platformer. Iremos aplicar conceitos que aprendemos anteriormente e, também, conhecer novas abordagens e ferramentas que o Unity nos oferece para o desenvolvimento de telas, interfaces, dentre outros.
Caso seja a primeira vez que acessa esta série, sinta-se à vontade para juntar-se a nós. A partir do primeiro tópico da jornada você poderá aprender “do zero” a criar um game utilizando Unity, desde a instalação e configuração da ferramenta até o desenvolvimento e criação do produto final em si. Já concluímos a criação do primeiro game (Forest Ping Pong) e estamos prestes a começar a desenvolver o segundo.
Em nosso último tópico abordamos tópicos sobre a utilização e obtenção de multimídias no desenvolvimento de jogos, mídias essas que iremos começar a utilizar a partir de agora. Vamos juntos nesta caminhada rumo a novos conhecimentos!
Plataformas bidimensionais
No desenvolvimento de nosso primeiro game, homenageamos um dos clássicos da primeira geração dos videogames, Pong. Por se tratar de um jogo de mecânicas simples, determinados conceitos expostos no primeiro projeto podem ser facilmente replicados em outros contextos, como por exemplo a utilização de scripts para interação entre os elementos do jogo e as movimentações e alterações realizadas nos parâmetros dos componentes Transform e Collider.
Agora, iremos criar do zero um novo tipo de jogo, também em perspectiva 2D, mas de outro gênero, que exige um determinado grau de controle sobre a física do personagem e dos elementos na tela. Trata-se do estilo platform, imortalizado por clássicos como Super Mario Bros., Alex Kidd in Miracle World e Mega Man.
Em comum, além de serem jogos de estilo platform 2D, os três games citados foram desenvolvidos no Japão na década de 1980, época em que muitas das convenções gerais do estilo foram criadas e aperfeiçoadas.
Algumas das características normalmente presentes nesse gênero são a presença de itens coletáveis, a utilização de pulos como um dos métodos de “deslocamento” pelas plataformas que dão nome ao estilo e o enfrentamento de perigos, que podem ser a presença de adversários, de abismos perigosos, de espinhos mortais, dentre outros.
A fim de homenagearmos essa tão importante categoria de games, iremos nos inspirar em um jogo também japonês e oitentista. Trata-se de City Connection, platformer 2D desenvolvido para arcade em 1985 pela Jaleco, posteriormente portado para videogames como o NES e o MSX.
Vandalizando em alta velocidade
Em City Connection, o jogador controla Clarice, uma jovem motorista que, dirigindo seu veículo, percorre sem parar rodovias elevadas com o único objetivo de pintar essas vias e fugir dos carros da polícia.
Apenas tomando como base a descrição, você pode pensar que se trata de um jogo de corrida e não de um platformer 2D, mas a implementação do game contém todos os elementos do gênero: você pode pular com o carro para mudar de via, utilizar itens para tirar de seu caminho os adversários, tomando cuidado com espinhos e obstáculos.
Os caminhos que Clarice percorre são cíclicos; ou seja, não há um início e um fim determinado, com os trechos se repetindo após alguns segundos dirigindo em uma direção. Dessa forma, o jogador consegue pintar as rodovias sem ter que voltar muito para trás, caso reste algum trecho não pintado.
Após a conclusão da pintura de todos os trechos de via de uma fase, o jogador é transportado a uma nova fase, com um novo fundo temático, mais pistas a pintar e adversários a enfrentar.
City Connection é reconhecido até hoje por ter sido um dos primeiros jogos com uma protagonista feminina. Além de não ser mais uma “donzela em perigo”, Clarice é uma motorista com muita atitude (e com um pé na clandestinidade!).
Iniciando o desenvolvimento
Assim como na obra da Jaleco, em nosso game o jogador também controlará um carro em pistas infinitas, mas, em vez de pintar (e vandalizar) as vias públicas, deverá coletar presentes nas fases e desviar de bombas no caminho. Trata-se do mais novo sucesso de nossa autoria, o jogo Motorista da Pesada.
Para começar, realize o download do projeto “Unity_02_MotoristaDaPesada”, que está hospedado no GitHub do GameBlast. Assim como em nosso primeiro projeto, basta acessar o link, clicar no botão verde Code e, em seguida, em Download Zip.
Após baixar o arquivo, descompacte-o na pasta de sua preferência. Abra o Unity Hub, clique em Projects, na seta ao lado de Open e, em seguida, em Add project from disk, conforme imagem ilustrativa:
Nosso segundo projeto será listado a partir de agora no Unity Hub. Clique nele para abri-lo. Como trata-se da primeira vez que iremos abri-lo, o Unity realizará alguns processamentos internos, o que poderá demorar alguns minutos.
Novos elementos
Após abrir o projeto no Unity, note que, na janela Assets da barra Project, temos três pastas contendo os elementos que iremos utilizar para compor nosso projeto: Multimidia, Scenes e Scripts.
Abra a pasta Multimidia e, depois, verifique o conteúdo das três pastas Audios, Fontes e Imagens. São esses elementos que irão dar vida aos personagens e elementos do jogo que iremos criar.
Agora, retorne à pasta Assets e clique duas vezes sobre a pasta Scene. Diferentemente de nosso primeiro projeto, desta vez iremos utilizar mais de uma cena em nosso jogo. Já estão disponíveis no projeto-base duas cenas para trabalharmos, de nomes MenuInicial e Fase01.
Inicialmente iremos elaborar os elementos pertencentes à cena correspondente ao menu inicial, mas é importante já termos ideia de como o jogo irá operar. O diagrama a seguir detalha as transições entre as cenas de acordo com as ações realizadas, o que iremos trabalhar mais adiante:
Base do menu inicial
Agora vamos colocar a mão na massa. Ainda na aba Project, dentro da pasta Assets clique duas vezes sobre o item Scenes e, finalmente, em MenuInicial.
Para garantir que as proporções de tela estão corretamente configuradas, na aba Game verifique se estamos trabalhando com as dimensões de Tamanho fixo (960x600), conforme imagem a seguir. Depois, retorne à aba Scene.
Nossa primeira cena está bem vazia, somente com dois elementos listados na aba Hierarchy. Vamos começar criando um Canvas, para inserirmos os elementos que irão compor nosso menu inicial. Clique com o botão direito do mouse em um espaço vazio na aba Hierarchy. No menu suspenso que for exibido, clique em UI e, depois, em Canvas.
Selecione CanvasMenuInicial na aba Hierarchy. Na aba Inspector, altere os dados referentes ao componente Canvas pelos mostrados na imagem a seguir, mais especificamente os parâmetros Render Mode e Render Camera:
A última etapa descrita é realizada para que a tela do Canvas seja sobreposta à exibição do que está sendo captado pela câmera da cena (no caso, o GameObject Main Camera) e nas proporções de tela.
Agora, na aba Hierarchy clique com o botão direito sobre o objeto CanvasMenuInicial, em UI e, depois, em Image. Dê o nome Logo para o novo objeto, conforme ilustração a seguir:
Ao configurar os parâmetros do componente Rect Transform do objeto Logo, o primeiro item deve ser configurado como Top Left, os valores de Width e Height iguais a 200, Pos X = 125 e Pos Y = -125, conforme exemplo abaixo:
No componente Image, em Source Image, na aba Assets selecione o desenho de nome logoMotorista. Também selecione a opção Preserve Aspect, cuja funcionalidade impede as imagens de ficarem distorcidas:
Agora vamos adicionar uma imagem de fundo para o nosso menu. Na aba Hierarchy, selecione o GameObject CanvasMenuInicial. No fim da aba Inspector, clique em Add Component, em UI e, depois, insira um componente do tipo Image.
No campo Source Image, escolha na aba Asset a imagem de nome FundoMenu. Observe como ficou bonito e moderno nosso fundo de tela:
Objetos e layout
Agora iremos inserir na tela os botões e informações que, de fato, irão compor nosso menu. Na aba Hierarchy, clique com o botão direito em CanvasMenuInicial e, em seguida, em Create Empty. Dê o nome de TelaInicial ao objeto criado.
Repita esses mesmos passos e crie outro objeto com o nome de TelaSobre.
Selecione tanto TelaInicial quanto TelaSobre na aba Hierarchy e dê os seguintes valores para os seus respectivos componentes Rect Transform: primeiro item do tipo Stretch Stretch, Left = 250 e o valor 25 para Right, Top e Bottom, conforme imagem a seguir.
Ainda com TelaInicial e TelaSobre selecionados, no final da aba Inspector clique em Add Component e insira componente do tipo Vertical Layout Group.
Componentes do tipo Layout Group são elementos especiais disponibilizados pelo Unity para facilitar nossa organização em relação aos itens de uma listagem, como por exemplo botões em um menu. A partir da configuração de seus parâmetros, conseguimos fazer com que os GameObjects subordinados tenham suas dimensões determinadas automaticamente.
Configure os Vertical Layout Groups com os parâmetros descritos na imagem a seguir:
Agora iremos alimentar esses grupos com elementos que terão suas dimensões controladas por esses parâmetros. Na aba Hierarchy, clique com o botão direito sobre TelaInicial e insira um elemento de texto (UI > Text) de nome Titulo e dois elementos do tipo botão (UI > Button) de nomes Opcao1 e Opcao2, conforme exemplificado na imagem a seguir:
Ainda na aba Hierarchy, clique com o botão direito sobre TelaSobre e insira dois elementos de texto (UI > Text) de nomes Titulo e Conteudo e um elemento do tipo botão (UI > Button) de nome Opcao3, conforme exemplificado na imagem a seguir:
Fontes, cores e efeitos
Vamos trabalhar agora apenas com os elementos de TelaInicial. Para isso, na aba Hierarchy, selecione TelaSobre e desabilite-o na aba Inspector, conforme indica a imagem:
Clique sobre o elemento Titulo, subordinado ao GameObject TelaInicial. Edite os parâmetros do componente Text conforme ilustração abaixo.
Como uma fonte nova faz toda a diferença, não é mesmo? Porém, nota-se também que em determinados pontos da tela há pouco contraste entre a letra e o fundo da tela. Vamos então escurecer um pouquinho a imagem de fundo, clicando sobre o elemento CanvasMenuInicial e alterando o tom de cor do componente Image para os parâmetros descritos na imagem:
Agora vamos alterar algumas características dos botões. Selecione os GameObjects Opcao1 e Opcao2 e, na aba Inspector, altere o tom de cor do componente Image para o indicado a seguir.
Percebeu que os botões ficaram um pouco transparentes? A alteração do parâmetro “A” da cor de uma imagem é o responsável por esse efeito.
Agora, selecione os GameObjects de nome Text que estão subordinados a Opcao1 e Opcao2. Na aba Inspector, altere os parâmetros do componente Text para os indicados na ilustração a seguir:
Por fim, selecione apenas o GameObject Text subordinado a Opcao1 e, na aba Inspector, em Text mude o valor de texto para “Iniciar partida” (sem as aspas):
Faça o mesmo para o GameObject Text subordinado à Opcao2, mas altere o valor de texto para “Sobre o game” (também sem as aspas):
Clique na aba Game para dar uma olhada em como está ficando nosso menu. Depois, volte à aba Scene e salve a cena (menu File, Save) e o projeto (menu File, Save Project).
Próximos passos
Começamos a criação de um novo projeto, desta vez elaborando um menu de entrada como forma tanto de dar as boas-vindas aos jogadores como, também, para exibir os créditos dos autores das multimídias envolvidas.
Em nosso próximo encontro, finalizaremos a criação do menu e daremos início à configuração e à codificação da cena da primeira fase do jogo Motorista da Pesada.
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