Tutorial Snake 3D usando Unity - Parte 2

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:

  1. Câmeras e cenas
  2. 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.

Fez | Baixe e compre hoje - Epic Games Store

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:

  1. Clique em "Add component" que está aparecendo no inspetor do objeto selecionado
  2. Digite o nome do novo componente
  3. Selecione "New script"
  4. 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.