Caso não tenha acompanhado desde o início, no primeiro tópico desta série vimos como instalar e configurar o Unity em seu equipamento. Embarque junto e venha conosco nesta jornada de aprendizado!
Um mundo de possibilidades
Em nosso último tópico, após concluirmos a instalação da ferramenta Unity em nossos computadores, criamos um pequeno projeto vazio para aferir se a instalação ocorreu corretamente. Caso ainda o tenha em seu computador, abra-o via Unity Hub. A interface do programa mostrada foi esta:
Na tela do programa, existem diversas seções que nos ajudam a manipular e organizar melhor os objetos, itens, imagens, áudios, scripts, dentre outros itens que irão compor as mágicas aventuras que iremos desenvolver. Vamos descobrir quais são as principais seções da interface, com as quais iremos interagir durante o decorrer do processo de elaboração dos games:
Aba Project: Presente na parte inferior da janela do Unity, a aba Project permite visualizarmos os arquivos e subpastas que compõem nossos projetos por meio da exibição do conteúdo da pasta Assets. O que colocarmos ou criarmos nessa pasta, sejam imagens, sons, modelos 3D, arquivos de scripts, dentre outros, estarão disponíveis para utilização em um projeto criado.
Aba Hierarchy: Presente no canto superior esquerdo da tela, mostra os objetos (GameObjects) que compõem uma cena (Scene). As cenas são agrupamentos de objetos que representam, grosso modo, as fases e telas de nossos jogos. Nesse exemplo em específico, como trata-se de um projeto novo com apenas uma cena praticamente vazia, apenas dois objetos estão presentes: a câmera (MainCamera) e a iluminação (Directional Light).
Aba Inspector: Presente do lado direito da tela, a aba Inspector permite, a partir da seleção de um objeto na aba Hierarchy, aferir todos os componentes que aquele objeto tem atrelado a si. Os componentes de um objeto são as “características” dele: no exemplo da imagem ilustrativa, trata-se de um objeto de nome “Personagem01” com, dentre outros, um componente do tipo Image (imagem).
Abas Scene e Game: Em destaque no centro da tela, encontramos a aba Scene, que permite manipularmos os objetos que estão dispostos na cena, sejam eles 2D ou 3D. Podemos, por exemplo, deslocá-los, girá-los ou apenas movimentar nossa visualização pela cena, a fim de enxergarmos melhor os componentes dela (que podem ser muitos, dependendo da complexidade da fase ou da tela do jogo).
Dicas para um melhor manejo da tela desta aba: utilize o mouse clicando com o botão esquerdo sobre a imagem da cena em conjunto com as teclas Ctrl + Alt para movimentação, o botão esquerdo em conjunto somente com a tecla Alt para rotação da imagem e a utilização do scroll do mouse (a rodinha) para aplicar zoom na imagem. Experimente!
Ao lado da aba Scene está presente (minimizada) a aba Game, que permite visualizarmos como o jogo irá se apresentar ao ser executado na tela de um dispositivo, seja ele desenvolvido para computadores, videogames, celulares ou outros dispositivos. Voltaremos a abordá-la em breve.
Menus e ferramentas: No extremo superior da tela encontramos os menus do Unity, que permitem, dentre outras coisas, salvar o projeto e a cena; recortar, copiar ou colar itens; e refazer ou desfazer ações. Os botões imediatamente abaixo dos menus permitem o manejo da visualização da cena e dos objetos na aba Scene com o mouse de diversas formas: movimentação, giro, deslocamento, etc. Já os botões centrais dessa barra, com destaque especial ao botão Play (um pequeno triângulo apontando para a direita, no centro da barra), permitem a execução do jogo dentro do Unity para experimentarmos como ele está até o momento; para isso, ele ativa a aba Game e ali mostra o conteúdo do jogo em andamento.
É importante, após simular a execução do jogo utilizando a aba Game, pressionar novamente o botão Play para parar a execução do mesmo, pois alterações no jogo que forem realizadas enquanto o mesmo estiver "rodando" não são salvas.
Começando nosso desenvolvimento
Agora que fomos apresentados aos principais componentes da interface gráfica do Unity, é hora de aprendermos mais sobre o que são os objetos mais a fundo. Para isso, nada melhor do que colocar a mão na massa, não é mesmo?
Hoje iremos iniciar o desenvolvimento de um projeto baseado em um dos primeiros sucessos de todos os tempos do mundo dos videogames: Pong (1972), que serviu como base de inspiração para praticamente toda a primeira geração de videogames, desenvolvidos entre 1972 e 1983. Trata-se de um jogo para dois jogadores que simula partidas de tênis de mesa virtual.
Na tela do game são apresentadas duas barrinhas brancas, uma de cada lado, e uma bolinha (um “quadrado branco”) que pinga de um lado ao outro da tela. Cada jogador controla o movimento de uma das barrinhas no sentido vertical. O objetivo é utilizar a barrinha para rebater a bolinha ao lado do adversário e torcer para que seu oponente não consiga rebatê-la de volta, recompensando o jogador com um ponto.
Como estamos começando nossa jornada de aprendizado na programação de jogos utilizando Unity, vamos homenagear esse jogo pioneiro com uma adaptação dele aos novos tempos.
Para começar, faça o download do projeto “Unity_01_ForestPingPong”, que está hospedado no GitHub do GameBlast. Caso nunca tenha utilizado o GitHub, fique tranquilo: acesse o link, clique 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:
O nosso projeto inicial será listado a partir de agora no Unity Hub. Clique nele para abri-lo. Como será o primeiro acesso a ele, o Unity realizará alguns processamentos internos, e isso poderá demorar um pouco, mas é normal.
Preparo prévio
Para simplificar todo o processo daqui em diante, realizaremos algumas operações no Unity nessa primeira abertura de um projeto, a fim de facilitar nossa vida. São preparos prévios no ambiente que permitirão uma melhor integração do Visual Studio (a ferramenta de codificação em C#) ao Unity e, também, a definição de dimensões de tela fixas.
Primeiro, clique no menu Edit e, em seguida, em Preferences:
Selecione External Tools e, em External Script Editor, selecione o Visual Studio, conforme imagem ilustrativa. Em seguida, clique em Regenerate project files e feche essa pequena janela.
Clique no item ao lado de Display 1 (indicado em vermelho na imagem a seguir) e clique no sinal de mais (+):
Em Label, digite “Tamanho fixo” (sem as aspas); em Type, selecione Fixed resolution; e nos campos mais abaixo, digite 960 e 600, respectivamente, como na imagem ilustrativa a seguir. Após isso, clique novamente no item ao lado de Display 1 e selecione o recém-criado “Tamanho fixo”.
Agora já poderemos começar, de fato, a explorar o projeto e aprender mais sobre objetos, componentes e, posteriormente, o papel dos scripts na programação de jogos em Unity.
Objetos: os atores de um jogo
Vamos começar visualizando os componentes principais da cena do nosso jogo. Para isso, na aba Project, clique duas vezes sobre a pasta Scenes e, em seguida, sobre Cena01, conforme imagem a seguir:
Agora, temos acesso a todo o conteúdo da Cena01. Observe como são interessantes a composição gráfica dos objetos na aba Scene e a listagem dos mesmos na aba Hierarchy:
O nome dado aos objetos de uma cena no Unity é GameObject. Vamos começar a destrinchá-los, dentro da aba Hierarchy, clicando no GameObject de nome Canvas. Veja quantos componentes diferentes são apresentados na aba Inspector:
Objetos que apresentam o componente do tipo Canvas são como “telas de pintura”, pois permitem a exibição de imagens, gravuras, desenhos, textos e demais itens gráficos que são muito utilizados em videogames. Clique agora na setinha ao lado do GameObject Canvas, na aba Hierarchy. Você observará diversos outros objetos “subordinados” ao GameObject em questão:
Clique no objeto de nome PlacarJogador, subordinado ao objeto PlacarFundo. Veja como as propriedades apresentadas na aba Inspector mudam: trata-se de um GameObject com componente atrelado do tipo Text (texto):
Na aba Hierarchy veja que já temos dispostos objetos com nomes bem sugestivos, como ImagemFundo, Personagem01 e 02, PlacarFundo, PlacarJogador e PlacarAdversario. Esses serão alguns dos GameObjects que utilizaremos para compor nosso game.
Por enquanto, se observarmos bem, temos alguns elementos legais, mas que, graficamente falando, apresentam pouco apelo visual. Tudo bem que, à época do Pong, tecnicamente era possível exibir apenas quadrados e barras bem simples na tela, mas já estamos no século XXI, não é mesmo?
Então, como forma de dar um “upgrade” na experiência gráfica do jogo, que tal criarmos uma versão mais “selvagem” do game, substituindo o fundo escuro por algo mais colorido, verde e azul, e as barrinhas por cobras silvestres?! Essa será a pedra fundamental de nosso primeiro grande sucesso, o Forest Ping Pong!
Florestar é preciso
Vamos começar modificando as barrinhas para que exibam as cobras na floresta. Clique no objeto Personagem01 e, em seu componente Image exibido na aba Inspector, clique na bolinha ao lado de Source Image, conforme exemplo a seguir:
Selecione a imagem de nome “cobra01” e feche a janelinha. Veja que a barrinha já se foi. Agora em seu lugar temos uma animada cobra verde:
Repita o processo com o GameObject Personagem02, mas, ao final, você deverá escolher a imagem de nome “cobra02”.
Agora daremos um fundo bem ecológico ao nosso jogo. Na aba Hierarchy selecione o objeto ImagemFundo. Observe que ele não tem um componente Image na aba Inspector:
Iremos conceder manualmente um componente Image ao GameObject. Clique em Add Component no canto inferior da aba Inspector, selecione UI e, em seguida, Image; conforme imagem ilustrativa:
Agora já temos um fundo branco por detrás das nossas colegas peçonhentas. Com o novo componente Image adicionado ao GameObject ImagemFundo, assim como foi feito com os objetos Personagem01 e 02, mude a Source Image para uma imagem de nome “fundoFloresta”. Aos poucos nossa cena vai ganhando cara de jogo de verdade!
Selecione o objeto IconeJunglePingPong, subordinado ao objeto PlacarFundo. Se preferir, dê um duplo clique sobre ele, para que na tela Scene se dê um zoom sobre o objeto. Percebe-se que ele já tem um componente do tipo Image, conforme a aba Inspector indica:
Altere a Source Image para uma imagem de nome “logotipo”. Perceba que mudou a representação gráfica do objeto na cena:
Um tipo de componente presente em todos os objetos de uma cena é o Transform. Ele é o componente responsável por registrar o posicionamento físico de objeto em uma cena a partir de coordenadas tridimensionais (X, Y e Z); além disso um Transform registra rotação, escala, dentre outros atributos.
No caso de objetos que são “desenhados” subordinadamente a um Canvas, o Transform se “transforma” em RectTransform, cujo papel é bem semelhante, mas trabalhando com coordenadas bidimensionais (X e Y). Observe o RectTransform do IconeJunglePingPong:
Vamos aumentar seu tamanho horizontal, mudando o parâmetro Width do objeto de 100 para 200. Note o que ocorrerá:
Para terminar de “avivar” a aparência de nosso game, vamos complementar o visual pintando o fundo do nosso placar. Para isso selecione o GameObject PlacarFundo e, no atributo Image apresentado na aba Inspector, clique na caixa branca ao lado de Color e selecione uma cor legal, de sua preferência:
Próximos passos
Até o momento preenchemos nossa cena do jogo com elementos gráficos bem interessantes. Nosso próximo passo será terminar essa composição visual e começar a codificar a interação entre os elementos do game e as ações do jogador, por meio do uso de scripts.
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