Sie sind auf Seite 1von 15

Criação de um Jogo Simples de Asteroides 2D no Unity

Introdução

Este tutorial terá como base o tutorial


http://blog.lessmilk.com/unity-spaceshooter-1/

E usará suas imagens. Baixe daqui:


www.lessmilk.com/unity/assets.zip

Usaremos a linguagem C# (CSharp).

Faça o download do Unity – http://unity3d.com e instale.

Criação do Jogo

Criar um novo jogo do tipo 2D (Setup defaults for:) com nome Asteroides2D.
Não precisa selecionar nenhum pacote.

Área da Tela
No painel Game, logo abaixo, clique em Free Aspect e selecione 5:4, para que nosso jogo
seja mostrado em uma área menor.

Criar as pastas em Assets:

E também a pasta Audio


Crie a pasta Prefabs assim:
Clicar sobre Assets com o botão direito – Create – Folder (Prefabs)

Selecione a pasta Prefabs


Tecle Ctrl+D para duplicá-la
Tecle F2 e renomeie para Scenes
Assim crie as demais.

Salvar a Cena
Clique em qualquer lugar da cena
Tecle Ctrl+S
Dê o nome fase1 e salve na pasta Scenes

Importar as Texturas
Descompacte o arquivo zip baixado
Abra a pasta Textures
Clique com o botão direito – Import New Asset...
Vá até a pasta das imagens baixadas
Selecione todas as imagens, exceto particle e as importe
Drag and Drop
Também podemos selecionar as imagens pelo Windows Explorer, arrastar e soltar na pasta
Textures do Unity.

Renomear as imagens
background – Fundo
bullet – Bala
enemy – Asteroide
spaceship – Nave
spawn - Clonador

Adicionar o Fundo/Background
Arraste a textura Fundo para a hierarquia. Podemos arrastar e soltar manualmente na cena,
mas assim precisariamos ajustar manualmente sua posição. A vantagem de soltar na
hierarquia é que o background fica centralizado. No caso do fundo já fica na posição
adequada. Clique na Main Camera e veja que o fundo ocupa quase a mesma região da Main
Camera, ou seja, quase inteiramente o fundo aparecerá para o jogador.

Adicionando a Nave na Cena


Arrastar a Nave para a hierarquia.
Depois disso apenas precisamos regular a altura, ajustando a posição pelo Inspector
Position (0,-4.5,0)

Criar o Script naveScript


Criar um novo script chamado naveScript e do tipo C#.
Abra a pasta Scripts
Clique com o botão direito dentro da pasta Scripts – Create – C# Script
Entre com o seguinte conteúdo para o mesmo:

using UnityEngine;
using System.Collections;

public class naveScript : MonoBehaviour {

public GameObject bala; // A ser preenchido via Inspector com o prefab bala
public int speed = 10;

void Update() {
// Move a nave horizontalmente com setas ou com as teclas A e D
// Eixo X – na horizontal
float horizontal = Input.GetAxis("Horizontal") * speed * Time.deltaTime;
transform.Translate(horizontal, 0, 0);// Aplicando as mudanças

// Quando a barra de espaços é pressionada ele atira


if (Input.GetKeyDown("space")) {
// Cria uma nova bala na posiçao atual da nave para que siga a nave
Instantiate(bala, transform.position, Quaternion.identity);
}
}
}
Anexar este script ao objeto Nave
Selecione a Nave na hierarquia
No Inspector clique em Add Component – Scripts - naveScript

Observe no Inspector que que a variável Bala precisa ser preenchida. Vamos criar a bala.

Adicione o componente Rigidbody 2D


Selecione o objeto Nave na hierarquia
Clique em Add Component – Physics 2D – Rigidbody 2D
Marque a propriedade Is Kinematic para que este objeto não seja afetado pela física, mas
controlado pelo script.

Adicione o componente Box Collider 2D


Selecione o objeto Nave na hierarquia
Clique em Add Component – Physics 2D – Box Collider 2D

Execute o jogo
Clique no botão Play e mova a nave com as setas para a esquerda e para a direita. Observe
que a nave pode sair da tela para os dois lados. Mais à frente resolveremos isso.

Adicionando a Bala à Cena


Arraste a Bala da pasta Textures e solte na hierarquia.
Atualize a Position para (0, -3.8, 0)

Adicionar Rigidbody 2D e Box Collider 2D à bala


Adicione os componentes Rigidbody 2D e Box Collider 2D, mascando Is Kinematic no
primeiro.

Crie o script balaScript


Criar um novo script chamado balaScript, do tipo C# contendo:

using UnityEngine;
using System.Collections;

public class balaScript : MonoBehaviour {

public float speed = 6;

// É chamado apenas uma vez quando a bala é criada


void Start () {
// Ajusta a velocidade Y para fazer a bala se mover para cima
rigidbody2D.velocity = new Vector2(0, speed);
}

// Quando a bala ficar invisível será destruída


void OnBecameInvisible() {
// Destroi a bala quando já está fora da tela
Destroy(gameObject);
}
}
Anexar este script ao objeto Bala.
Siga o procedimento anterior para a Nave.

Criando o Prefab bala


Como nossa Bala está pronta e será controlada através do script, podemos transformá-la em
um prefab e remover da cena.

Abra a pasta Prefabs


Arraste o objeto Bala da hierarquia e solte na pasta Prefabs.

Deletar a Bala da hierarquia.


Clique e tecle em Delete.

Preenchendo Variável public com Prefab no objeto Nave


Selecione o objeto Nave na hierarquia
No Inspector role a tela até aparecer o script naveScript, assim:

Abra a pasta Prefabs, arraste o prefab Bala e solte na caixa Bala, sobre None (Game Object),
para que fique assim:

Execute o Jogo
E aperte na barra de espaços para atirar e mova a nave.

Adicionar o Asteroide à Cena


Arraste o sprite Asteroide da pasta Textures e solte na hierarquia.
Position (0,4,0)

Adicionar Rigidbody 2D e Box Collider 2D ao Asteroide


Selecione o objeto Asteroide na hierarquia
Adicione os componentes Rigidbody 2D e Box Collider 2D, mascando Is Kinematic no
primeiro.

Criar script asteroideScript


Criar um novo script chamado asteroideScript do tipo C# contendo:

using UnityEngine;
using System.Collections;

public class asteroideScript : MonoBehaviour {

// Contem a velocidade do asteroide


public int speed = -5;

// Chamada quando o asteroide é criado


void Start () {
// Adicionar speed à velocidade do asteroide
rigidbody2D.velocity = new Vector2(0, speed);

// Faz o asteroide rodar em si mesmo aleatoriamentre entre -200 e 200 graus


rigidbody2D.angularVelocity = Random.Range(-200, 200);

// Destroi o asteroide após 3 segundos, que ele não está mais visível na tela
Destroy(gameObject, 3);
}
}

Anexar este script ao objeto Asteroide


Como feito anteriormente.

Criando o Prefab Asteroide


Como será manipulado através da programação criaremos um prefab para ele.

Abra a pasta Prefabs


Arraste o objeto Asteroide da hierarquia e solte na pasta Prefabs.

Deletando o objeto Asteroide da hierarquia.


Selecione e tecle Delete.

Executar o Jogo
Vamos melhorar isso, após adicionar o clonador.

Adicionar o Clonador
Este objeto tem o objetivo de clonar o Asteroide fazendo nascer alguns em posições
aleatórias.

Arraste o Clonador da pasta Textures para a hierarquia.


Depois altere sua posição para (0, 5.6, 0). Os Asteroides ficarão sendo clonados daqui.
Assim aparece um pouco na cena mas não é visto no Game.

Criar o script clonadorScript

Criar este novo script contendo:

using UnityEngine;
using System.Collections;

// Clona o Asteroide aleatoriamente na tela


public class clonadorScript : MonoBehaviour {

// Armazenará o prefab Asteroide


public GameObject asteroide;

// Variável para conhecer quão rápido nós devemos criar novos Asteroides
public float spawnTime = 2;

void Start() {
// Chamar a função 'addEnemy' a cada 'spawnTime' segundos
InvokeRepeating("addEnemy", spawnTime, spawnTime);
}

// Nova função para clonar/spawn um Asteroide


void addEnemy() {
// Variável para armazenar a posição X do objeto spawn. Veja abaixo
var x1 = transform.position.x - renderer.bounds.size.x/2;
var x2 = transform.position.x + renderer.bounds.size.x/2;

// Aleatoriamente escolhe um ponto dentro do objeto spawn


var spawnPoint = new Vector2(Random.Range(x1, x2), transform.position.y);

// Criar um Asteroide na posição 'spawnPoint'


Instantiate(asteroide, spawnPoint, Quaternion.identity);
}
}

Anexar este script ao objeto Clonador.


Faça da mesma forma anterior.

Adicionar prefab para a Variável Asteroide


Arraste o prefab Asteroide para a variavel asteroide no Inspector para o objeto Clonador.

Executar o Jogo
Teste e veja como está. Agora os asteroides caem de posições aleatórias.

Mostrar Vidas do Jogador

Adicionar um GameObject do tipo GUI Text


GameOject – Create Other – GUI Text
Renomear para Vidas

No Inspector, com Vidas selecionado, entrar em Text - Vidas: 3

Agora para o Vidas:


Position (0.84, 0.98, 0)

Editar o script naveScript, deixando assim:

using UnityEngine;
using System.Collections;

public class naveScript : MonoBehaviour {

public GameObject bala; // A ser preenchido via Inspector com o prefab bala
public int speed = 10;
private int vidas = 3;
public GUIText vidasGui; // Arrastar vidas da hierarquia para esta variavel

void Update() {
//Move a spaceship horizontalmente. Move esquerda e direita com setas ou A e D
float horizontal = Input.GetAxis("Horizontal") * speed * Time.deltaTime; // Eixo - X
transform.Translate(horizontal, 0, 0);// Aplicando as mudanças

// Quando a barra de espaços é pressionada


if (Input.GetKeyDown("space")) {
// Cria uma nova bala na posiçao atual da nave
Instantiate(bala, transform.position, Quaternion.identity);
}
vidasGui.fontStyle=FontStyle.Bold;
vidasGui.fontSize = 18;
vidasGui.text = "Vidas: " + vidas;
}
}

Anexar o GUI Text para Nave no Inspector


Selecionar Nave na hierarquia
Arrastar Vidas da Hierarquia para a variável Vidas no Inspector

Experimente
Veja se aparece a quantidade de vidas.

Agora vamos providenciar a colisão entre a Nave e os Asteroides.

Adicionando uma tag ao objeto Asteroide


Selecione o prefab Asteroide
Role a tela no Inspector
Clique na combo em Tag – Add Tag…
Em Element 0 digite – asteroidTag
Clique no prefab Asteroide novamente
Clique na combo Tab e selecione asteroidTag

Editar o script naveScript

Adicione este método ao final, abaixo do método Update():

void OnTriggerEnter2D (Collider2D outro){


//Debug.Log("Teste");
if(outro.gameObject.tag == "inimigoTag"){
vidas = vidas - 1; // Cada colisao perde uma vida
AudioSource.PlayClipAtPoint(audioNaveColisao, transform.position);

if(vidas==0){// Quando topar 3 vezes com o inimigo morre


Destroy(this.gameObject);
Application.LoadLevel("menu");
}
}
}
Adicionar Audio
Vamos adicionar áudio para as balas e para a colisão entre nave e asteroide.

Bala
Import os dois arquivos de audio para a pasta Audio
Este som é implementado apenas com a IDE do Unity
Selecione o prefab Bala
Component – Audio – Audio Source
Rolar o Inspector para que mostre o Audio Clip
Arraste o áudio audioBala para o Audio Clip.

Colisão com a Nave


Este som é controlado pelo script.
Para isso precisamos apenas do áudio da explosão, para depois arrastar para a variável no
Inspector.

Editar o Script naveScript

Deixando assim:

using UnityEngine;
using System.Collections;

public class naveScript : MonoBehaviour {

public GameObject bala; // A ser preenchido via Inspector com o prefab bala
public int speed = 10;
private int vidas = 3;
public GUIText vidasGui; // Arrastar vidas da hierarquia para esta variavel
public AudioClip audioNaveColisao; // Arrastar o audio laser para esta variavel

void Update() {
// Move a spaceship horizontalmente - Move esquerda e direita com setas ou A e D
float horizontal = Input.GetAxis("Horizontal") * speed * Time.deltaTime; // Eixo - X
transform.Translate(horizontal, 0, 0);// Aplicando as mudanças

// Quando a barra de espaços é pressionada


if (Input.GetKeyDown("space")) {
// Cria uma nova bala na posiçao atual da nave
Instantiate(bala, transform.position, Quaternion.identity);
}
vidasGui.fontStyle=FontStyle.Bold;
vidasGui.fontSize = 18;
vidasGui.text = "Vidas: " + vidas;
}

void OnTriggerEnter2D (Collider2D outro){


//Debug.Log("Teste");
if(outro.gameObject.tag == "asteroideTag"){
vidas = vidas - 1; // Cada colisao perde uma vida
AudioSource.PlayClipAtPoint(audioNaveColisao, transform.position);
if(vidas==0){// Quando topar 3 vezes com o inimigo morre
Destroy(this.gameObject);
}
}
}
}

Adicionar Pontos e Recorde

Adicionar dois objetos GUI Text, um para Pontos e outro para Recorde.

GUI Text – Pontos


Text – Pontos: 0
Position (0.01, 0.98, 0)

GUI Text – Recorde


Text – Recorde: 0
Position (0.4, 0.98, 0)

Adicionar novo GameObject – Create Empty – renomear para Pontuacao


Arrastar e soltar sobre a Main Camera, para que seja um filho dela.

Criar o script pontosScript contendo:

using UnityEngine;
using System.Collections;

// Este script foi anexado a um objeto GameObject Empty arrastado para dentro da Main
Camera
// Este script precisa ficar anexado a um objeto que esteja o tempo todo valendo, como a main
camera ou o background
public class pontosScript : MonoBehaviour {

public GUIText pontosGui;// Arrastar da hierarquia Pontos para a variavel publica


Pontos da Main Camera
public GUIText recordeGui;// Arrastar da hierarquia Recorde para a variavel publica
Recorde da Main Camera
public int pontos = 0;// Dar acesso ao script nave, por isso public

void Update () {
if(pontos > PlayerPrefs.GetInt("Recorde")){
PlayerPrefs.SetInt("Recorde", pontos);
}
pontosGui.fontStyle = FontStyle.Bold;
recordeGui.fontStyle = FontStyle.Bold;
pontosGui.fontSize = 18;
recordeGui.fontSize = 18;
pontosGui.text = "Pontos " + pontos;
recordeGui.text = "Recorde: " + PlayerPrefs.GetInt("Recorde");
}
}
Anexar este script ao objeto Pontuacao.

Cadastrar as Variáveis Pontos Gui e Recorde Gui no Inspector para o objeto Pontuacao.
Arrastar Pontos da Hierarquia para a variável em Pontuacao
Arrastar Recorde da Hierarquia para Pontuacao.

Adicionando a TAG para a Bala


Adicione e associe como visto acima, chamando de balaTag.

Edite asteroideScript

using UnityEngine;
using System.Collections;

public class asteroideScript : MonoBehaviour {

// Contem a velocidade do asteroide


public int speed = -5;
private pontosScript ptScript; // Para se comunicar com o scriptNave

// Chamada quando o asteroide é criado


void Start () {
ptScript = GameObject.Find ("Pontuacao").GetComponent<pontosScript> ();
// Adicionar speed à velocidade do asteroide
rigidbody2D.velocity = new Vector2(0, speed);

// Faz o asteroide rodar sobre si mesmo aleatoriamentre entre -200 e 200 graus
rigidbody2D.angularVelocity = Random.Range(-200, 200);

// Destroi o asteroide em 3 segundos, quando ele não está mais visível na tela
Destroy(gameObject, 3);
}

void OnTriggerEnter2D (Collider2D outro){


if(outro.gameObject.tag == "balaTag"){
Destroy (this.gameObject);
ptScript.pontos ++;
}
}
}

Adicionar o audioBala para o prefab Asteroide.

Aprontando o Gatilho
Os objetos Nave, Bala e Asteroide precisam ter a propriedade Is Trigger ativada no seu
componente Box Collider 2D.

Só depois funcionarão corretamente.


Adicionar Cena menu

Adicionar uma nova cena


File – New Scene
Ctrl+S nome menu na pasta Scenes

Adicionar ao Build Settings


File – Build Settings …
Arraste da pasta Scenes a cena menu para a região Scenes In Build e depois arraste a cena
fase1.

Adicionar a textura Fundo para a cena menu.


Com a cena menu aberta
Arrastar Fundo para a hierarquia e renomeie para Menu

Criar scriptMenu contendo:

Para que o jogador escolha sua opção com o mouse ou tecle ESC para sair do jogo.

using UnityEngine;
using System.Collections;
// Importar uma imagem para o background bg_menu, onde ficara o botão
// E associar este script ao objeto Fundo
public class menuScript : MonoBehaviour{

void Update() {
// Teclando ESC saira do Jogo, mas somente no executavel e nao dentro do
editor
if (Input.GetKey ("escape")) {
Application.Quit();
}
}

void OnGUI(){
const int buttonWidth = 120;
const int buttonHeight = 30;

Rect buttonTitulo = new Rect(50,30, 400, 30);

// Determinar o lugar do botão na tela


Rect buttonPrimeira = new Rect(50,100,buttonWidth, buttonHeight);
//Screen.width / 10 - (buttonWidth / 2),
//(2 * Screen.height / 20) - (buttonHeight / 2),
//buttonWidth, buttonHeight);

Rect buttonSair = new Rect(50,150,buttonWidth, buttonHeight);


Rect buttonCreditos = new Rect(20,300,450, 50);

GUI.Button(buttonTitulo,"Menu Principal - Jogo de Nave com o Unity3D");


GUI.Label(buttonCreditos,"Adaptaçao de Ribamar FS dos tutoriais do Equilibre
Cursos e lessmilk.com");
if(GUI.Button(buttonPrimeira,"Primeira Fase")){// Rotulo do botao
Application.LoadLevel("fase1");
}
if(GUI.Button(buttonSair,"Sair")){// Rotulo do botao
Application.Quit();
}
}
}

Anexar este script para o objeto Main Camera.

Execute
Agora podemos testar nosso joguinho, que já conta com vários e bons recursos.

Caso tenha problemas ao executar a nova fase menu, não aparecendo nada na tela.
Experimente clicar na pasta Assets com botão direito – Sync MonoDevelop Project

Nosso joguinho ficará assim, depois de pronto:

Impedindo que a Nave saia da Tela

Edite o naveScript e deixe assim:

using UnityEngine;
using System.Collections;

public class naveScript : MonoBehaviour {

public GameObject bala; // A ser preenchido via Inspector com o prefab bala
public int speed = 10;
private int vidas = 3;
public GUIText vidasGui; // Arrastar vidas da hierarquia para esta variavel
public AudioClip audioNaveColisao; // Arrastar o audio laser para esta variavel

void Update() {
// Move a spaceship horizontalmente - Move esquerda e direita com setas ou A e D
float horizontal = Input.GetAxis("Horizontal") * speed * Time.deltaTime; // Eixo - X
transform.Translate(horizontal, 0, 0);// Aplicando as mudanças

//Restringir o movimento entre dois valores


if(transform.position.x <= -5.6f || transform.position.x >= 5.6f){
// Criando o limite
float xPos = Mathf.Clamp (transform.position.x,-5.6f,5.6f);
// Limitando
transform.position = new Vector3(xPos,transform.position.y,
transform.position.z);
}

// Quando a barra de espaços é pressionada


if (Input.GetKeyDown("space")) {
// Cria uma nova bala na posiçao atual da nave
Instantiate(bala, transform.position, Quaternion.identity);
}
vidasGui.fontStyle=FontStyle.Bold;
vidasGui.fontSize = 18;
vidasGui.text = "Vidas: " + vidas;
}

void OnTriggerEnter2D (Collider2D outro){


//Debug.Log("Teste");
if(outro.gameObject.tag == "asteroideTag"){
vidas = vidas - 1; // Cada colisao perde uma vida
AudioSource.PlayClipAtPoint(audioNaveColisao, transform.position);

if(vidas==0){// Quando topar 3 vezes com o inimigo morre


Destroy(this.gameObject);
Application.LoadLevel("menu");
}
}
}
}

Experimente
Agora, ao mover a nave ela esbarrará nos extremos esquerdo e direito, mantendo-se na tela.

Configurando, Compilando e Publicando o Jogo

Agora vamos criar um EXE para distribuir nosso jogo.

File – Build Settings …

Platform – PC, Mac & Linux


Em Target Platform selecione Windows

Clique em Player Settings


Depois em Resolution e ajuste para 512 x 384:
Desmarcar Full Screen

Clique em Build

Entre o nome Asteroides

Das könnte Ihnen auch gefallen