Asteroides2D - WordPress.com

Transcrição

Asteroides2D - WordPress.com
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

Documentos relacionados