Alura > Cursos de Programação > Cursos de Jogos > Conteúdos de Jogos > Primeiras aulas do curso Unity: criando um jogo metroidvania 2D

Unity: criando um jogo metroidvania 2D

Criando e configurando o player - Apresentação

Se você é uma pessoa entusiasta da indústria de jogos e quer entender como os jogos são feitos, venha conosco que vamos te mostrar.

Audiodescrição: William Carvalho se identifica como um homem branco. Tem cabelo cacheado e olhos castanhos. Usa barba e bigode mustache longo, curvado para cima. Está com uma camiseta preta com estampa de um alienígina verde. Ao fundo, estúdio da Alura iluminado com tons de azul e verde. À direita, uma estante com objetos geek.

Boas-vindas ao curso de desenvolvimento de jogos em Unity!

O que vamos aprender?

Ao decorrer do curso, vamos aprender a desenvolver o jogo "A Vingança de Blaid", onde nossa personagem tenta recuperar uma cidade tomada por inimigos. Vamos andando pelo cenário, combatendo nossos inimigos e nos divertindo enquanto desenvolvemos um jogo muito legal.

Captura de tela do jogo de plataforma 2D intitulado 'A Vigança de Blaid'. Ilustração de estilo desenho animado com uma personagem loira com armadura e espada em mãos. À sua direita, um robô roxo e vermelho com um único olho amarelo. Ambos estão em uma plataforma amarela e verde sob fundo roxo.

Para desenvolver esse jogo incrível, vamos aprender a utilizar a Unity como motor de jogo (game engine), tanto de gráfico como de código, para fazer o maior proveito de suas ferramentas e produzir o jogo de forma produtiva.

Além disso, vamos aprender e implementar um padrão de projeto muito utilizado no desenvolvimento de jogos, que é o Singleton, que facilita muito nosso desenvolvimento.

Vamos também aprender como o template de código que a Unity fornece pode ajudar no desenvolvimento do nosso jogo, aumentando nossa produtividade e tornando um projeto pequeno em algo mais robusto.

Ademais, vamos entender como criar e utilizar um Game Manager de forma eficiente, que é um objeto responsável por gerenciar os parâmetros principais do nosso jogo.

Vamos compreender como as animações são usadas e implementadas dentro de jogos, além de como podemos controlar as animações de forma dinâmica enquanto o jogo está rodando.

E falando em controle, vamos utilizar uma ferramenta incrível da Unity, que é o novo Input System, onde podemos configurar inputs para movimentar personagens tanto pelo teclado, quanto pelo controle do Xbox ou Playstation e até pelo touchpad - tornando nosso jogo ainda mais fácil de ser portado para outras plataformas.

Mais adiante no curso, vamos entender como criar um sistema de som robusto e escalável no nosso jogo. Assim, quando quisermos mudar algum asset de áudio, podemos alterar isso apenas com um clique - sem precisar reescrever vários trechos de código.

Por fim, vamos aprender a implementar assets de arte do nosso jogo para poder criar um level design (design de nível) muito bonito, robusto e ainda atrativo para as pessoas jogadoras.

Pré-requisitos

Antes de aprender tudo isso, para você poder aproveitar esse curso ao máximo, recomendamos que você tenha conhecimento em programação, porque vamos desenvolver vários tipos de código e é importante entendê-los.

Por isso, aconselhamos fortemente que você faça a formação de C#, que é a linguagem que a Unity usa e a linguagem que vamos utilizar o tempo inteiro nesse curso.

Para você se aprofundar mais nos conteúdos abordados, além dos vídeos, também vamos deixar atividades para você realizar ao decorrer do curso.

Se tiver alguma dúvida, você pode recorrer ao fórum e também à nossa comunidade do Discord da Alura. Vamos estudar?

Criando e configurando o player - Criando um GameObject e script

Com o ambiente pronto, podemos dar início à criação do nosso projeto.

Criando projeto 2D

Como criar um projeto na Unity? Podemos simplesmente abrir a Unity Hub clicando duas vezes em seu ícone.

Quando a Unity Hub se abre, podemos conferir várias informações no menu lateral esquerdo, como os nossos projetos, as instalações das versões, a Unity Learn para aprender conteúdos específicos diretamente pela Unity e, por fim, o espaço da comunidade.

No momento, ainda não temos nenhum projeto criado. Por isso, no menu "Projects", vamos clicar no botão localizado no canto superior direito, chamado "New Project".

Feito isso, a Unity Hub carrega outra tela que lista alguns templates que a Unity já fornece para otimizar a criação de um jogo. Por exemplo, contamos com modelos 2D e 3D com opções de mobile, para celular, e também URP, que usa uma versão gráfica mais avançada.

Levando em consideração que esse é o nosso primeiro jogo e não temos muito conhecimento de Unity, o interessante é criar um projeto em 2D. A partir do momento que selecionamos a opção "2D", aparecem alguns campos para configuração do projeto na lateral direita.

A primeira opção é o nome do projeto. Nesse caso, vamos colocar A-Vinganca-De-Blaid-2D. Com esse sufixo, saberemos qual template utilizamos na criação desse projeto. Isso facilita caso tenhamos vários projetos, pois não precisamos abrir o projeto inteiro para conferir se ele está em 2D ou 3D.

Logo abaixo, podemos definir uma localização para salvar o projeto. Vamos usar uma pasta que criamos para esse projeto em específico, chamada "Projetos Unity".

E por último, temos a opção de usar a Cloud Organization da Unity. Caso você não tenha uma organização, é preciso criar uma para poder iniciar o desenvolvimento do seu projeto. Sugerimos que você coloque um nome profissional para facilitar a busca e venda de jogos futuramente. No nosso caso, usamos "Prof Will", pois é de fácil identificação.

Não vamos utilizar as duas últimas opções que servem para conectar a Unity Cloud e usar a Unity Version Control, portanto, não precisamos selecioná-las. Basta clicar no botão "Create Project" no canto inferior direito.

Agora a Unity vai pegar esse template que criamos e vai iniciar uma configuração para o nosso projeto.

Conhecendo a interface da Unity

Assim que o projeto termina de carregar, podemos navegar pela interface de criação de jogos.

Vamos conferir o que tem nessa interface? No centro da tela, já tem a visualização de cena que é a tela mais importante do nosso projeto, porque será onde criaremos os objetos de personagens, nível e afins.

Na lateral esquerda, contamos com uma janela chamada hierarquia que vai trazer todos os objetos que estão dentro da cena, a tela principal. No momento, só temos uma câmera principal (Main Camera) dentro da hierarquia, pois faz parte do template padrão criado pela Unity.

Se clicarmos em qualquer objeto dentro da hierarquia, aparece uma série de informações sobre ele na janela do inspetor na lateral direita.

Nesse caso, aparecerão as informações contidas no objeto chamado "Main Camera", que está dentro da nossa cena. Ele tem os componentes de "Transform", que será responsável pela posição, escala e rotação de objetos. Também conta com o componente de câmera, responsável por renderizar e mostrar toda a cena para quem está jogando. Por fim, também tem o componente de Audio Listener para ouvir os áudios. Existem vários outros componentes que podem ser adicionados.

Criando GameObject e Script

Para iniciar o nosso projeto, vamos criar um personagem. Para isso, vamos clicar com o botão direito na janela de hierarquia e selecionar a opção "2D Object > Sprites > Square" para criar um quadrado.

O quadrado, que chamamos de um objeto primitivo da Unity, será o nosso personagem por enquanto - até nos acostumarmos com a interface e entender o que precisamos fazer. Por isso, vamos renomear esse quadrado para Player, pois será o nosso jogador.

Para garantir que o projeto está funcionando corretamente e deu tudo certo com a criação do template, vamos criar o famoso script "Hello World".

Para criar um script, vamos precisar focar na parte inferior da tela, que é a janela de projetos. A janela de "Project" é um local de criação de pastas para organizar tudo que iremos acessar no nosso projeto.

Para manter uma boa organização e facilitar a localização dos assets utilizados, vamos criar primeiramente uma pasta onde guardaremos todos os scripts do nosso jogo. Basta clicar com o botão direito na janela de projetos e selecionar a opção "Create > Folder". Vamos chamar essa nova pasta de Scripts.

Agora, vamos clicar duas vezes para entrar na pasta. Dentro dela, vamos de novo clicar com o botão direito e escolher "Create > C# Script" para criar um script. Podemos nomeá-lo como PlayerBehavior, porque esse script será responsável pelo comportamento do jogador.

Feito isso, a Unity vai compilar os scripts e vai garantir que está tudo funcionando corretamente. Por isso, precisamos esperar esse processo ser concluído.

Executando "Olá Mundo!"

Em seguida, podemos clicar duas vezes nesse script para abri-lo no Microsoft Visual Studio, que é responsável por renderizar todos os nossos scripts.

Quando criamos um C# Script, a Unity sempre vai criar um template básico de script com funções e bibliotecas exclusivas da Unity.

PlayerBehavior.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerBehavior : MonoBehaviour
{
        // Start is called before the first frame Update
        void Start()
        {
    
        }

        // Update is called once per frame
        void Update()
        {
    
        }
}

Ao invés de uma função Main(), a Unity traz o void Start() e o void Update(). Acima das funções, também há um comentário, explicando brevemente o que cada uma faz.

O void Start() será chamado no primeiro frame (quadro) do nosso jogo, ou seja, o início. Isso significa que será igual ao void Main() do C# nativo. Enquanto o Update() será chamado em todo frame. Não vamos utilizar o Update() nesse momento, então vamos deixar para explicá-lo no futuro. Inclusive, podemos apagá-lo do script.

Em void Start(), vamos printar o famoso "Hello World". Para isso, vamos usar o Debug.Log(). Entre aspas duplas, vamos escrever a string "Hello World!".

public class PlayerBehavior : MonoBehaviour
{
        // Start is called before the first frame Update
        void Start()
        {
                Debug.Log("Hello World!");
        }
}

Após salvar o script, podemos voltar para o projeto na Unity.

Com isso, a Unity vai compilar e atualizar o script existente. Ao selecionar o script com apenas um único clique, podemos conferir o código do script na janela de inspeção na lateral direita. Nesse caso, só tem o "Hello World".

Mas, se apertarmos o play agora, nada vai acontecer. Para fazer com que o script rode, ele precisa estar atrelado a um objeto que esteja na cena. Contudo, não existe nenhum objeto que possui o PlayerBehavior no momento.

Por isso, vamos realizar a adição do PlayerBehavior dentro do Player. Na janela de hierarquia, selecionamos o objeto Player. Assim, podemos clicar e arrastar o PlayerBehavior para a janela de inspetor do jogador na lateral direita. Com isso, vamos atrelar o Player, que no caso é o quadrado, ao script de PlayerBehavior.

Também poderíamos clicar no botão de "Add component" na parte inferior do inspetor e buscar por PlayerBehavior para adicioná-lo ao Player. Mas tomem cuidado para não ter dois scripts adicionados juntos, porque isso pode trazer sérios problemas para o nosso jogo.

Para poder visualizar a mensagem de "Hello World", vamos abrir outra janela chamada "Console", que está do lado da janela projetos. Com essa janela selecionada, podemos apertar o botão "Play" na barra de ferramentas na parte superior da interface. Após carregar, a Unity já traz a mensagem printada no console:

[15:22:00] Hello World!

A interface da Unity deve ficar um pouco mais escura após apertar o play para identificar que o projeto está em execução. Mas, também é possível alterar as configurações para deixar a interface de outras cores, como em tons de vermelho, para facilitar a visualização e não esquecer de sair do play quando terminar de realizar os testes.

Para sair da execução, basta clicar novamente no botão "Play".

Próximos passos

Já criamos um script do PlayerBehavior e o testamos. No próximo vídeo, vamos dar início à criação dos inputs. Afinal, sem os inputs, não conseguimos movimentar o player para nenhum lado.

Criando e configurando o player - Configurando o input system

Com o player já configurado e o projeto criado, precisamos ter os inputs de movimentação do personagem para que ele possa se movimentar. Caso contrário, nosso player não vai sair do lugar.

Para fazer isso, vamos utilizar um sistema de input robusto da Unity, que vai facilitar bastante a nossa produtividade para a criação de novos inputs.

Baixando sistema de input

Para iniciar o download desse sistema de input, vamos selecionar a opção "Window" no menu superior e clicar em "Package Manager" para abrir a janela do gerenciador de pacotes.

Para ter acesso ao pacote do input, precisamos trocar os pacotes listados. Na barra superior, vamos clicar na primeira opção chamada "Packages" que atualmente está em "In Project" e mudar para "Unity Registry".

Agora, para não ter que procurar dentro todos os pacotes existentes, podemos buscar por "Input System" na barra de pesquisa no canto superior direito. Apenas um resultado aparece, pois só existe esse sistema de input da Unity. Podemos clicar no botão "Install" para instalar a versão 1.7.0.

Existe um sistema mais antigo, mas ele dificulta um pouco o desenvolvimento quando o projeto começa a ficar maior. Por isso, vamos utilizar esse sistema de input, que inclusive é recomendado pela Unity.

Após baixar o pacote, a Unity vai pedir para reiniciar o nosso projeto. Para aceitar, basta clicar no botão "Yes" que significa "sim".

A Unity já reiniciou e a biblioteca de código do Visual Studio foi alterada. Por isso, é preciso recarregar a solução no Visual Studio para ele ter todas as referências corretas. Após clicar em "Recarregar" no aviso de "Modificação de arquivo detectada", podemos minimizar a IDE e voltar para a Unity.

Com isso, podemos conferir que o input system já está instalado na pasta "In Project" no "Package Manager". Após fechar a janela do Package Manager, vamos iniciar a configuração e a criação dos nossos inputs.

Criando e configurando input

Agora, vamos criar o sistema de input e, para isso, é preciso criar um input actions.

Mas, antes disso, vamos seccionar a pasta de "Scripts" para manter uma boa organização. Primeiro, vamos criar uma nova pasta chamada "Player", que vai conter todos os scripts do jogador, clicando com o botão direito da janela de projetos. Podemos clicar e arrastar o script de PlayerBehavior lá para dentro e esperar a recompilação.

Como mudamos o script de lugar, será preciso recarregar o projeto e abrir o gerenciador na lateral esquerda do Visual Studio para encontrar o script em seu novo diretório.

Novamente na Unity, vamos criar outra pasta chamada "Input". Em seguida, vamos clicar com o botão direito de novo dentro da pasta de "Input" e selecionar a última opção "Create > Input Actions".

Quando vamos nomear um input actions, é importante sempre dar um nome que seja pertinente com as ações existentes dentro desse mapeamento de inputs. Como estamos criando os inputs de movimentação para o jogador, vamos chamar esse input actions de PlayerControls.

Feito isso, podemos clicar duas vezes em PlayerControls para abri-lo. Vamos conferir as áreas dessa interface da janela de input actions.

Na esquerda, temos a área de "Action Maps", que será responsável por ter os mapas das nossas ações.

Basicamente, os mapas de ações são um conjunto de ações que serão realizadas em um mesmo contexto ou em um contexto similar.

Como vamos criar agora a movimentação do personagem, o nome de contexto ideal para o action map pode ser Gameplay. Para criar esse action map, vamos clicar no ícone de mais ao lado direito do título da área e chamá-lo de Gameplay.

Ao criar o action map, já surge uma ação pré-criada na área do meio intitulada "Actions". Vamos apertar a tecla "Delete" para excluir essa ação e aprender a criar uma do zero. Basta clicar no ícone de mais ao lado direito do título "Actions" e criar uma nova ação. Como é a ação de movimentação, vamos renomeá-la como Movement.

Se expandimos o Movement, descobrimos que ele ainda não tem nenhum binding, ou seja, não tem nenhuma tecla que ativa essa ação de movimento. Portanto, é preciso criar uma tecla para poder movimentar o player.

Só que antes, devemos realizar uma configuração na área de "Action Properties" na lateral direita. No dropdown de "Action Type", devemos definir qual é o tipo de ação que queremos realizar, escolhendo dentre três opções: value, button e o pass through.

Como precisamos mover o personagem para a direita ou esquerda, vamos mudar para a opção de value. Pois, a opção de button só nos indica se um botão foi apertado ou não.

No dropdown de "Control Type", também vamos precisar realizar uma alteração. Se deixamos em button será retornado apenas 0 e 1. Não é isso que queremos. Vamos movimentar o nosso personagem no eixo X, ou seja, para a esquerda e para a direita. Portanto, vamos mudar o tipo de valor para axis.

Agora, podemos deletar a opção "No Binding" dentro de "Movement", porque esse é um binding referente ao tipo de button. Assim, podemos criar um binding referente ao valor.

Apertamos o ícone de mais à direita de "Movement" e selecionamos "Add Positive\Negative Binding". Vamos chamar esse binding de [Arrows] Left/Right Arrow. Também é importante dar um nome pertinente para o binding para facilitar a compreensão.

No eixo X do plano cartesiano, o valor negativo é sempre para a esquerda e o valor positivo é sempre para a direita.

Ao selecionar a opção do binding negativo, vamos conferir a área de Binding Properties na lateral direita. No dropdown de "Path", vamos selecionar "Keyboard > By location of Key" e achar a opção "Left arrow". Depois, vamos selecionar o binding positivo e escolher a opção de path do "Keyboard > By location of Key > Right arrow".

Para recapitular, exemplificamos e mostramos para a Unity qual botão queremos apertar para movimentar o player para a esquerda e para a direita.

Antes de fechar, precisamos salvar. Para isso, vamos selecionar o botão "Save Asset" na parte superior da ação. Não recomendamos usar o autosave, porque pode acabar salvando alguma configuração errada e será mais difícil identificá-la.

Não se preocupe. Caso você feche a janela e as configurações não estejam salvas, a Unity vai perguntar se quer salvá-las ou não - desde que a opção de autosave esteja desmarcada.

Gerando script para input

Após fechar o PlayerControls, precisamos realizar uma última configuração. Para poder movimentar o player via script, devemos gerar um script do PlayerControls, que foram as configurações de input que realizamos.

Mas não precisamos fazer isso manualmente, pois a Unity já fornece uma opção para gerar automaticamente um script com todos os inputs criados no input actions, o qual chamamos de PlayerControls.

Para isso, vamos clicar no PlayerControls e selecionar a opção "Generate C# Class" na janela do inspetor na lateral direita. Feito isso, surgem algumas opções para definir onde guardar o arquivo, o nome e o namespace. Porém, não precisamos mexer em nada disso no momento - somente se quiséssemos fazer algo mais customizado. Por isso, vamos só apertar em "Apply" para gerar script de PlayerControls.

É possível selecioná-lo e visualizar seu código dentro da janela de inspeção na Unity mesmo, sem precisar abrir o Visual Studio. É basicamente um JSON e algumas funções para facilitar a criação dos inputs.

Confira o arquivo PlayerControls.cs completo.

Próximos passos

Com o input criado, precisamos arranjar uma forma do PlayerBehavior acessar esses inputs e poder movimentar o personagem de acordo com os botões que apertarmos. Vamos fazer isso no próximo vídeo.

Sobre o curso Unity: criando um jogo metroidvania 2D

O curso Unity: criando um jogo metroidvania 2D possui 252 minutos de vídeos, em um total de 67 atividades. Gostou? Conheça nossos outros cursos de Jogos em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Jogos acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas