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