Como criar um jogo Android básico com o Unity

neste tutorial semelhante, veremos como criar um Android jogo usando Unity.



Requisitos:

  • Unidade
  • Um bom editor de texto como NotePad ++ (opcional, mas recomendado)
  • Android SDK
Se você ainda não o tem, deve começar baixando e instalando o SDK do Unity e também o SDK do Android. Precisamos do Android SDK para que possamos testar o APK do jogo dentro de um ambiente Android.

Inicie o Unity e crie um novo projeto. Faça um projeto 2D.



Existem vários painéis para se familiarizar - o painel Hierarquia que conterá todos os nossos elementos de cena (cena = qualquer “nível” em que você está trabalhando atualmente). Depois, há a guia Jogo, que é usada para jogar / testar seu jogo dentro do editor e, à direita, você tem o painel Inspetor, onde você editará várias coisas, como iluminação, física, etc.



A primeira coisa que queremos fazer é criar um sprite - este será nosso personagem principal (que controlamos). Você pode desenhar seu próprio sprite, como apenas desenhar um quadrado com os olhos, ou você pode pegar um sprite da internet - apenas certifique-se de que é um arquivo .PNG (fundo transparente).



Arraste e solte seu sprite na janela da cena principal (a janela maior) - ele também aparecerá no painel Hierarquia à esquerda.

Então, agora vamos criar algumas plataformas - podem ser quadrados simples, porque seremos capazes de redimensioná-los facilmente para fazer paredes e outras plataformas.

Então, apenas crie um novo “sprite” quadrado e arraste e solte-o na janela Scene, como você fez com seu personagem sprite.



Agora precisamos instruir o Unity para dar física ao nosso personagem principal - clique em seu personagem sprite principal (ele deve ficar destacado em azul na janela Scene), então no painel Inspector, procure por “GameObjects”.

Clique em “Adicionar componente> Física 2D> RigidBody2D”. Isso adicionará física automaticamente ao seu sprite, que de outra forma você teria que criar um script em outro SDK.

Queremos evitar que o personagem principal do sprite gire fora de controle - então encontre a guia Constraints no painel Inspector (com o sprite principal ainda destacado na janela Scene) e marque a caixa “Freeze Rotation Z”.

Se você apertar o botão 'Jogar', seu personagem sprite principal deve cair do céu e cair indefinidamente - vamos cuidar disso mais tarde, mas observe como fomos facilmente capazes de aplicar a física. A física que aplicamos depende da forma em que estão sendo aplicados - então, se você aplicasse a mesma física a uma esfera, por exemplo, ela rolaria.

Também queremos corrigir nossa orientação para evitar que o personagem gire e gire livremente. Encontre 'restrições' no inspetor com o jogador selecionado e marque a caixa para congelar a rotação Z. Agora clique em jogar novamente e você deve encontrar o seu jogador agora caindo do céu para sua destruição infinita.

Para impedir que nosso personagem sprite principal caia indefinidamente, precisaremos adicionar um colisor. Este é basicamente apenas o contorno sólido de uma forma que adicionaremos ao personagem principal do sprite. Destaque seu personagem principal, clique em “Adicionar Componente> Física 2D> BoxCollider2D.

Agora faça exatamente a mesma coisa com a plataforma que você criou anteriormente. Seu personagem sprite principal deve agora “colidir” com a plataforma e permanecer lá.

Portanto, agora queremos ter certeza de que a câmera seguirá seu personagem principal do sprite - dentro da cena, já deve haver um objeto de câmera. Você quer arrastar isso Em cima de o personagem principal do sprite.

Isso é especialmente importante se você estiver criando um Corredor baseado em 3D , algo como Declive onde você precisa que a câmera permaneça constantemente atrás do objeto principal do jogo (seu personagem principal do sprite).

Agora vá para o painel Hierarquia e na lista de GameObjects, você deseja arrastar a câmera por baixo o personagem principal do sprite (Player GameObject). Isso tornará o personagem principal do sprite o ‘ pai ' da câmera. Portanto, sempre que o Player GameObject se move pela tela, a câmera deve segui-lo.

Então, para este tutorial de jogo, vamos apenas criar um tipo de jogo de corredor sem fim básico, algo como Corrida 3 , onde seu personagem principal irá correr pela tela e desviar de obstáculos (ou “fim do jogo” se você bater em um obstáculo. ”Isso vai exigir alguns scripts, a maioria dos quais serão fornecidos neste guia.

Clique com o botão direito na pasta “Ativos” e crie uma nova pasta - nomeie-a Scripts . Agora clique com o botão direito nesta nova pasta e clique em “Criar> Script C #” e nomeie-a PlayerControls . Este script vai definir o comportamento do nosso personagem sprite principal.

Quando você clica duas vezes neste novo script, devemos abrir no Visual Studio - alternativamente (e minha preferência pessoal), você pode editá-lo em algo como NotePad ++.

O arquivo de script já deve ter um pouco de código “boiler plate” dentro dele - basicamente, este é um script que precisa ser deixado sozinho ou apenas ajustado às suas necessidades e nos economizará muito tempo. Então, vamos adicionar um novo objeto.

Acima da linha vazio Iniciar ():

público Rigidbody2D rb;

O próximo pedaço de código que precisamos adicionar irá dentro de Start (), e é usado para encontrar o corpo rígido - basicamente, estamos instruindo o Unity a localizar a física que anexamos aos GameObjects (nosso personagem sprite principal) e Start () será executado quando um novo objeto ou script for criado.

Em seguida, localize o objeto de física.

rb = GetComponent< Rigidbody2D > ();

E você adicionará esta linha dentro do Update ()

rb.velocity = Novo Vector2 (3, rb.velocity.y);

O que Update () faz é atualizar constantemente, de modo que qualquer código adicionado a ele será executado continuamente (a menos que o objeto seja destruído). Então, o que fizemos foi instruir o script de que queremos que o corpo rígido tenha um novo vetor usando a mesma velocidade no eixo Y (rb.velocity.y), mas com uma velocidade de 3 no eixo horizontal. No futuro, você também pode usar ' FixedUpdate () ’ que é semelhante, mas diferente, porque lá você pode controlar a quantidade de atualização / atualização do script.

Salve o script e volte para o Unity, então clique no seu personagem sprite principal para destacá-lo. No painel Inspetor, vá para Adicionar componente> Scripts e adicione o script que acabamos de salvar. Agora, quando você clica no botão Play, o personagem sprite principal deve mover-se continuamente em direção à borda da plataforma.

Criação de controles de entrada do jogador

Então, como este é um jogo estilo corredor sem fim com obstáculos, precisamos adicionar controles para o jogador, como um botão de ‘pular’.

Reabra o script anterior e adicionaremos este código adicional:

 E se (Input.GetMouseButtonDown (0)) {rb.velocity = Novo Vector2 (rb.velocity.x, 5); }

Você vai colocar isso dentro do método Update (), e o que basicamente faz é dizer ao Unity que quando o jogador clica no botão do mouse (que será traduzido como um toque na tela do Android), o personagem sprite principal irá “pular ' no ar. Isso ocorre porque adicionamos uma velocidade no eixo Y com um valor de 5 (um valor mais alto significaria um salto mais alto, é claro).

Se você não está muito familiarizado com a codificação, usamos um E se declaração porque E se é basicamente um tipo de instrução 'faça ou não' - está literalmente dizendo SE isso acontecer, execute este comando . Portanto, se o jogador não estiver clicando com o mouse (ou tocando na tela do Android), obviamente o script não será executado.

Vá em frente e clique no botão “Play” e certifique-se de que funciona corretamente antes de continuar.

Em seguida, vamos adicionar nossos obstáculos (que podem “destruir” o sprite do personagem principal), uma pontuação do jogo e um menu “game over”.

Se você testou o jogo até agora, o único problema que temos até agora é que pressionar o botão 'pular' que criamos irá pular o personagem, não importa se ele está aterrado ou não - isso é basicamente Flappy Birds, e não um runner como nós queremos. Mas vamos consertar isso.

No script, adicione este trecho de código acima o método Update ():

 público Transformar groundCheck; público Transformar startPosition; público   flutuador groundCheckRadius; público LayerMask whatIsGround; privado   bool no chão; E então adicione esta próxima linha ao método Update acima do E se instrução: onGround = Physics2D.OverlapCircle (groundCheck.position, groundCheckRadius, whatIsGround); E em seguida, você mudará esta linha a seguir para incluir “&& onGround” E se (Input.GetMouseButtonDown (0) && onGround) {Portanto, todo o nosso script deve ser basicamente assim: público   classe   PlayerControls : MonoBehaviour { público Rigidbody2D rb; público Transformar groundCheck; público Transformar startPosition; público   flutuador groundCheckRadius; público LayerMask whatIsGround; privado   bool no chão; vazio   Começar () {rb = GetComponent (); } vazio   Atualizar () {rb.velocity = Novo Vector2 (3, rb.velocity.y); onGround = Physics2D.OverlapCircle (groundCheck.position, groundCheckRadius, whatIsGround); E se (Input.GetMouseButtonDown (0) && onGround) {rb.velocity = Novo Vector2 (rb.velocity.x, 5); }}}

Para explicar o que fizemos, criamos uma nova “transformação”, que significa uma posição no espaço do mundo do jogo. Nós definimos seu raio e estamos instruindo o Unity para verificar se o raio está se sobrepondo à nossa camada de 'solo' - e assim, se nosso raio estiver sincronizado com o 'solo', nosso personagem deve ser capaz de pular, e se nós já está no ar de um salto, não devemos ser capazes de saltar novamente. Basicamente, no chão será verdade E se a transformação chamada GroundCheck está se sobrepondo à camada do solo. Esperançosamente, isso faz sentido.

Então salve o script e volte para o Unity, e você notará que mais opções foram adicionadas ao Inspetor após destacar o player. Estas são variáveis ​​públicas e podemos ajustá-las ao nosso gosto.

Agora clique com o botão direito em Hierarquia e crie um novo objeto vazio, e arraste-o de forma que fique embaixo do sprite do personagem principal na janela Scene principal - posicione este objeto vazio onde queremos que o chão seja detectado. Renomeie o objeto para “Check Ground” e arraste-o para baixo do objeto de jogo do jogador, como fizemos anteriormente com a câmera (para criar uma relação pai - filho entre os objetos). Agora o objeto vazio seguirá o sprite do personagem principal, assim como a câmera, e verificará continuamente a distância do andar.

Agora selecione o sprite do personagem principal e vá para o painel Inspetor - arraste o objeto Check Ground para o espaço chamado “groundCheck”. A posição de 'transformação' deve ser igual à posição deste novo objeto, e onde diz 'Raio', faça 0,1.

Precisamos definir a camada do solo. Basta selecionar o terreno e no Inspetor, encontrar o botão “Camada: Padrão” (é uma caixa suspensa) e escolher “Adicionar Camada”.

Agora selecione “chão” como a camada para nossa plataforma e repita isso para qualquer outra plataforma na janela do jogo. Onde diz “What is Ground” em nosso objeto sprite do personagem principal, selecione também a camada de solo.

O que fizemos foi instruir o script do jogador a realizar uma verificação - E se o pequeno ponto na tela está se sobrepondo a qualquer coisa que corresponda à camada, o personagem irá pular somente se isso for verdade.

Fim de jogo em Colisão e menu de jogo

Então, para encerrar tudo, as coisas finais que queremos fazer são A: Fazer com que a colisão com os obstáculos resulte em um jogo acabado, e B: Crie uma tela de menu “game over” com um botão play again.

O que você basicamente quer fazer é:

  1. Adicione um Jogador objeto e atribuir um corpo rígido e um colisor de sua escolha.
  2. Adicione um Inimigo objeto e atribuir um corpo rígido e um colisor de sua escolha. (e opcional, adicione Tag “Inimigo” para isso)
  3. Crie um novo Script C # e adicione-o como um componente para Jogador (ou use qualquer script anexado ao player, não há necessidade de criar um novo se você já tiver um)
  4. Adicione isto em seu script:
vazio OnCollisionEnter ( Colisão coll) { Depurar . Registro ('Colisão'); // Verifique se ele mesmo registra uma colisão, se funcionar, você pode remover esta linha if (coll.gameobject. etiqueta == 'Inimigo') { // vê se o objeto com o qual seu jogador colidiu tem uma tag chamada 'Inimigo