Tutorial Snake 3D usando Unity - Parte 2
Iaí pessoal, tudo tranquilo com vocês? O que acharam da última parte? Foi muito rápido? Muito devagar? Difícil de acompanhar? Comentem o que acharam.
Hoje nosso foco é aprender a manipular a câmera da Unity e entender os elementos principais associados à ela, e entender mais da componentização da Game Engine que nos permite criar nossos próprios elementos e modelos para serem reutilizados. Este é um dos conceitos mais aproveitados dos programadores.
Já ouviram falar do "DRYI"? É o acrônimo para "Don't Repeat Yourself, Idiot" ou "Não repita a si mesmo, idiota". Basicamente este conceito fala que sempre que precisarmos repetir algum trecho de código precisamos 'refatorar', que é basicamente remover aquele trecho e encapsular ele pra ser reutilizado em outros lugares. Encapsular? É algo como colocar dentro de uma cápsula, ou no nosso caso dentro do escopo de uma função.
Eita, foi muito assunto repentino? Lembra que o foco desse tutorial não é apenas aprender a fazer jogos, mas sim te preparar para ser um desenvolvedor de jogos. Há grande diferença na interpretação dessa frase. Dito isso, vamos focar em:
- Câmeras e cenas
- Componentes
1. Câmera e cenas
A câmera é um elemento muito importante nos jogos. Jogos criam profundidade e mecânicas diferenciadas apenas manipulando a câmera do jogo.
O jogo FEZ acabou se destacando como um grande sucesso ao mostrar como a manipulação de câmera pode criar uma mecânica diferenciada na construção de puzzles. E para isso claro, vamos aprender alguns pontos chaves de como mexer na câmera da Unity e como poder aproveitar o básico para se adequar ao nosso tutorial.
Vamos começar selecionando o objeto chamado "Main Camera" que vem por padrão na cena. Agora podemos ver suas propriedades no inspector que fica do lado.
Em vermelho temos o Transform que é o componente responsável por características como posição, rotação e escala dos objetos. Mas isso vocês já sabem, tenho certeza, pois fizemos algumas manipulações no tutorial passado. Não fez a parte 1? Corre lá, confere como foi essa introdução, eu espero :B
E em amarelo temos um novo componente. Este é um componente padrão da Unity que já vem com várias propriedades que podemos manipular, inclusive via código. Os elementos que vão ganhar destaque hoje são:
-
Clear flags
é a propriedade que cuida do fundo da cena. A renderização do espaço ao redor da câmera que não é o cenário com objetos. Pode-se imaginar que seria o ambiente simulado do espaço do cenário. -
Projection
é a propriedade que define o tipo de câmera, ortográfica ou de perspectiva. Essa propriedade altera o modo como a câmera calcula a profundidade do cenário. -
Field of view
é a propriedade que mostra o ângulo de visão da câmera. -
Viewport Rect
é a propriedade que define o espaço de renderização da câmera selecionada na cena do jogo. Cada câmera do jogo pode ter um espaço cortado da cena renderizada do jogo. -
Clipping planes
é a propriedade que define o início do espaço que vai ser renderizado assim como o final da câmera.
Não vou falar muito sobre elas pois se não vamos estender bastante esta parte. Tudo que precisamos fazer é arranjar uma posição mais ideal pra poder visualizar a cobra de cima. Vou posicionar aqui de uma forma que dê para ver o cenário inteiro.
2. Componentes
E agora, os componentes. Poxa, faz horas que falo sobre componentes e agora finalmente vamos explicar o que são e como podemos aproveitá-los ao máximo. Os componente são peças chave do comportamento da Unity. Quando manipulamos o Transform estamos manipulando um componente que tem os aqueles atributos de posição, rotação e escala.
Acontece que nós podemos criar nossos próprios componentes. Por meio de scripts criamos variáveis que podem editar vários elementos da cena. Um exemplo simles disso é o tamanho da cobra. Podemos criar uma variável que diz quantas partes a cobra vai ter de tamanho.
Vamos criar agora nosso primeiro componente: a cobra.
Clique com o botão direito na hierarquia e vamos criar um elemento vazio na opção "Create empty" e renomeie do jeito que preferir. Vamos chamar de Snake para ficar claro o que é este objeto. O novo objeto criado pode vir com suas propriedades meio embaralhadas, por isso vamos resetar sua posição para 0, 0, 0.
Existem algumas várias formas de criar um componente, e aqui vai a mais simples:
- Clique em "Add component" que está aparecendo no inspetor do objeto selecionado
- Digite o nome do novo componente
- Selecione "New script"
- Selecione "Create and add"
Agora que o componente já foi criado e adicionado ao elemento, vamos clicar duas vezes e abrir no nosso editor de texto predileto. E agora, vamos adicionar um pequeno grau de complexidade: programação. E pra entrarmos nesse mar sem fundo, preciso te explicar algumas coisas.
-
UnityEngine
Este é o pacote que permite com que a gente tenha acesso ao escopo da Unity. -
MonoBehaviour
Esta é a classe que permite com que a gente acesse o estado da simulação. Os obejtos que herdam dessa classe podem acessar funções específicas que permitem calcular ações dentro da simuação do jogo. -
Start
Uma das funções principais da classe MonoBehaviour. Esta função é chamada uma única vez quando o objeto é criado na simulação antes do primero frame após a criação. -
Update
Uma das funções principais da classe MonoBehaviour. Essa função é chamada todo frame e por isso deve ter balanceamento na sua execução para não haver excesso de memória alocada no seu jogo.
E agora que já sabemos o básico da Unity, vamos criar o básico da nossa cobra. Precisamos contar qual o tamanho da cobra, e precisamos de uma função que aumente o tamanho dela.
Legal, agora temos nossa primeira função. Precisamos de uma maneira de testar ela e saber se vai funcionar quando a gente tentar executar ela de alguma forma. Para isso vamos dentro da função Update e vamos adicionar o seguinte trecho de código:
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Grow();
}
}
Basicamente estamos dizendo para fazer a leitura todo frame (dentro do Update) e que ao apertar uma vez (Input.GetKeyDown) o código da barra de espaço ( KeyCode.Space) vamos executar o trecho de código seguinte definido pelo escopo do if {}.
Podemos testar essa função adicionando uma chamada de console e verificando o console dentro da Unity. Para isso podemos adicionar o seguinte trecho:
void Grow()
{
// TODO
Debug.Log("I'm working");
}
Agora, sempre que apertamos barra de espaço na simulação, vai aparecer uma mensagem no console da Unity. Só precisamos garantir que nosso objeto esteja ativo na cena, marcando o checkbox dele no inspetor, depois damos play e apertamos barra de espaço. Et voilà.
Por fim, nossa última ação hoje será dentro da função "Grow". Vamos adicionar um contador na cobra para que toda vez que ela cresça a gente verifique esse crescimento e depois chame outras funções.
int length = 0;
void Grow()
{
// TODO
// Debug.Log("I'm working");
length += 1;
Debug.Log("Snake length " + length);
}
Agora, podemos verificar no console que toda vez que apertamos barra de espaço o tamanho da cobra vai aumentar.
Conclusão
Gente, isso encerra nosso tutorial de hoje. Fiquem ligados que na próxima semana vamos trabalhar mais em cima do cenário e dos modelos 3D que podem compor nossa cena. Obrigado a todos vocês leitores, deixem comentários sobre como estamos fazendo nossos tutoriais, apreciamos muito isso. Participem do nosso grupo no Whatsapp e nosso servidor no Discord.