Tutorial Unity 2D Chuva Game

Chuva Game







O chuva game é um dos mais básicos jogos para se desenvolver na Unity,
nesse tutorial vamos aprender a fazê-lo. E aprenderemos sobre uma característica
muito importante da Unity, os colisores.


Vamos selecionar a câmera principal na hierarquia e, em seguida,
definir a cor de fundo para preto.
Também ajustaremos o tamanho (para 5) e a posição (X e Y para 0), como mostra a imagem a seguir:


O balde

Nesse jogo, nosso herói é um balde, e seu objetivo é pegar o máximo de gotas.

Nota: Clique com o botão direito na imagem, selecione Salvar como ... , navegue até a pasta Assets
do projeto e salve-a.
Salve o arquivo do balde dentro da pasta do projeto.

Clique no arquivo “bucket”, para abrir sua Configuração de importação, e mude
o valor “Pixel per Unity” para 50.


Novamente dentro da Unity, vamos arrastar a imagem do balde, da aba
Projeto para dentro da cena, criando assim o GameObject do balde.


Na aba Hierarquia, vamos mudar o nome do objeto para “Balde” e
mudar sua posição X e Y para 0 e -4, respectivamente.


Nós precisamos que o balde faça parte da física do jogo, para isso, vamos
adicionar nele um corpo, dentro do inspetor do balde, clique em “Adicionar componente”, e
adicione um Rigidbody2D, uma vez adicionado, clicamos em “Constantes”, e
marcamos a caixa “Freeze position” na caixa “Y” e marcamos “Freeze Rotation” e
marcamos a caixa “Z”, com isso, nosso balde não pode se mover na vertical nem rotacionar.


Agora, precisamos fazer o balde colidir, vamos novamente adicionar um novo componente,
chamado “Box Collider 2D” e mudaremos os valores de X e Y no “Offset” e “Size”, deixando desse jeito:



Script do balde

Não é muito útil um balde que não se move, por isso, vamos adicionar um script de movimentação.
Vamos clicar em Adicionar componente - > Novo Script e vamos dar o nome de
MovimentacaoHorizontal.


Clique duas vezes para abrir o editor de script e coloque o seguinte código.


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

public class MovimentacaoHorizontal : MonoBehaviour {

 public float speed = 0.4f;
 Vector2 dest = Vector2.zero;
 

 // Use this for initialization
 void Start () {
  dest = transform.position;
 }
 
 // Update is called once per frame
 void FixedUpdate () {
  Vector2 p = Vector2.MoveTowards(transform.position,dest,speed);
  GetComponent&ltRigidbody2D&gt().MovePosition(p);   
   
   if(Input.GetKey(KeyCode.RightArrow) && valid(Vector2.right)){
    dest = (Vector2)transform.position + Vector2.right;
   }
   if(Input.GetKey(KeyCode.LeftArrow) && valid(-Vector2.right)){
    dest = (Vector2)transform.position - Vector2.right;
   }
  
 }

 bool valid(Vector2 dir){
  Vector2 pos = transform.position;
  RaycastHit2D hit = Physics2D.Linecast(pos + dir,pos);
  return (hit.collider == GetComponent&ltCollider2D&gt());
 }
}


A função “valid” válida o local para onde o balde está indo, e a função Vector2.MoveTowards
move o balde em si.

Agora o balde consegue se mover de um lado para outro, mas ele está sumindo
da tela quando vai muito para um lado ou para outro na tela.

Para evitar isso, vamos colocar colisores que servirão como “paredes”.

Na aba de hierarquia  vamos clicar em “Create Empty” para criar um objeto vazio,
objetos vazio são objeto invisíveis para o jogador, mas podem receber
componentes como qualquer outro objeto.



Vamos mudar o nome desse objeto para “Borda1”, e aplicar a ele um Box Collider 2D.

E vamos ajustar seu tamanho de forma que ele vire uma “parede” para o cenário,
mudando o “size” dentro do Box Collider, alterando os valores de X e Y para 0.2 e 10,
respectivamente, e depois   mudando o valor position para -7, dentro do Transform.


Agora, usando os mesmos passos da “Borda1”, iremos criar a “Borda2”,
modificando somente a posição, altere o valor de X para 7, como a imagem a seguir:


Chuva  

Não é um jogo de chuva sem chuva, agora, vamos fazer as gotas caírem do céu.
Vamos interpretar cada gota como um objeto em jogo. Porém diferente dos outros
objetos que criamos, precisamos de uma quantidade indeterminada de gotas,
em posições diferentes. por isso, precisamos que nosso jogo crie essas gotas para nós automaticamente.

Vamos criar um objeto invisível para servir de base para a criação das gotas. Vamos chamá-lo de “Nuvem”.


Agora vamos colocar o script da criação de gotas nesse objeto.

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

public class Nuvem : MonoBehaviour {

 // Use this for initialization

 public GameObject gota;

 public bool podeCair;
 void Start () {
  podeCair = true;
 }
 
 // Update is called once per frame
 void Update () {
  if(podeCair){
   CairGota();
  }
  
 }

 public void CairGota(){
  Vector3 position = new Vector3(Random.Range(-6.0f, 6.0f), 4.9f, 0);
  Instantiate(gota,position,Quaternion.identity);
  podeCair = false;
  StartCoroutine(tempoDeTiro());
 }

 IEnumerator tempoDeTiro(){
  yield return new WaitForSeconds(1f);
  podeCair = true;
 }
 
}
O script da nuvem basicamente faz aparecer um objeto numa posição aleatória em
relação ao eixo X, porém fixa no eixo Y, esse é o trabalho da função Instantiate.

O objeto instanciado pela função Instantiate é definido por nós, dentro da Unity

Uma vez colocado o script da Nuvem vamos atribuir o prefab “Gota”.






Faça download dessa imagem e salve na pasta do projeto com o nome de “droplet”

Agora, baixe o prefab da gota, no link abaixo, e salve como “Gota”.



Agora, dentro da Unity, abra o prefab, dentro da aba project para acessar seu Inspector,
e arraste a imagem “droplet” no Sprite renderer.

Um prefab nada mais é do que um objeto do jogo, porém no formado de um arquivo,
exportado de um projeto, e pronto para ser importado em outros projetos.
O projeto da gota tem todos os componentes necessários para funcionar, e está, inclusive,
ligada ao seu script, porém, ainda precisamos de um arquivo com esse script.
Nesse caso, apenas coloque o arquivo a seguir na pasta do projeto.


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

public class Gota : MonoBehaviour {

 // Use this for initialization
 void Start () {
  
 }
 
 // Update is called once per frame
 void Update () {
  
 }

 void OnTriggerEnter2D(Collider2D col)
    {
        Debug.Log("GameObject1 collided with " + col.name);
     Destroy(gameObject);
     if(col.name.Equals("Balde")){
     Contador.pontos++;
     Som.colisao = true;
     }
    }
}


Agora, arraste o arquivo de script da gota para dentro do Inspector do prefab.

Esse código testa se a gota colidiu com o balde, mas não tente executar seu jogo agora,
pois ainda falta algo importante.

Pontos

Vai ser difícil lembrar de quantas gotas você pegou enquanto joga, por isso,
vamos criar um placar, para registrar as gotas pegas.

Vamo clicar com o botão direito dentro do menu Hierarquia, vamos em UI > Text



Quando criamos um Text, ele cria também um Canvas, dentro da Unity, um canvas é
como um quadro em branco, onde nós podemos colocar vários objetos. O text é um texto simples.

Dentro do menu Hierarquia, coloque o canvas dentro da Main Camera, e abre o Inspector do canvas.



Dentro do Inspector do Canvas, no componente Canvas, altere o Render Mode
para Screen space - Camera, e no campo Render Camera arraste a Main Camera.






Agora vamos ao texto, dentro do inspector do texto, altere o valor Font Size para 30,
e então, crie o seguinte script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Contador : MonoBehaviour {

 // Use this for initialization


 public Text placar;
 public static int pontos;
 void Start () {
  pontos = 0;
 }
 
 // Update is called once per frame
 void Update () {
  placar.text = "Pontos: "  + pontos.ToString();
 }
}
Esse script tem um valor static int pontos que pode ser acessado por todos os scripts do códigos,
e com isso o valor de pontos pode ser alterado por outro script. E dentro da função update,
ele altera o texto de um objeto Text para o placar atual.
Dentro do Inspector do text, arraste o próprio objeto text do menu Hierarquia para dentro do script Placar.
(Imagem disso ai que eu descrevi acima)
Som

Para tornar mais agradável o jogo, vamos colocar um relaxante som de gota.

Primeiro baixe o arquivo abaixo e salve na pasta do projeto com o nome “drop”.



Agora, dentro da Unity, crie dentro do menu Hierarquia, um Audio > Audio Source e
coloque o nome “Som_gota”, dentro de seu Inspector, coloque na caixa Audio Clip o
arquivo de som “drop” e mude a posição Y do Audio Source para 7 e crie para ele
um script chamado “Som”.



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

public class Som : MonoBehaviour {

 public AudioSource gota;

 public static bool colisao;

 // Use this for initialization
 void Start () {
  colisao = false;
 }
 
 // Update is called once per frame
 void Update () {
  if(colisao){
   gota.volume = 0.5f;
   gota.loop = false;
   gota.Play();
   colisao = false;
  }
 }
}

Esse script testa quando a gota toca no balde para tocar o som atribuído.
Arraste o Audio Source para a caixa dentro do script no Inspector.

Agora execute o seu jogo.

Desafio

Utilizando os conceitos aprendidos neste tutorial, coloque a seguinte imagem de fundo:



Postar um comentário

0 Comentários