Menu

08 – Tutorial Intermediário – Escolhendo Fase

Chegamos a parte 8 do nosso tutorial! Desta vez vamos aprender a fazer aquelas telas de seleção de fase como vários jogos tipo Mario, Double Dragon Neon e outros…

Na aula passada nós fizemos o menu principal e o de seleção de personagens não é mesmo? Então caso ainda não tenha salvado a Scene, a hora é agora, pois vamos criar uma nova Scene.

Caso já tenha salvado, basta pedir para criar nova Scene no menu File >> New Scene. A primeira coisa que vou pedir nessa scene é repetir a ultima coisa que fizemos na passada, salvar. Então bora lá em File >> Save Scene e a salvamos com o nome MenuFases:

01- Tutorial Selecionar Fase

Agora, dê dois cliques na Scene Main ali em cima, para a gente poder voltar para a Scene do Menu Principal. Lá iremos abrir o Script GCSelecaoPersonagem dentro da pasta scripts/controllers.

Nesse script temos o método novoJogo que salva os dados da escolha do jogador dentre GameStatus não é mesmo? Bom, no final desse script vamos agora adicionar o método para mudar de Scene.

Quem é das antigas aqui e passou pelo tutorial básico, deve se lembrar do método Application.LoadLevel(), não é mesmo? Porém na versão 5 esse método já está desatualizado e logo deve ser removido do Unity em versões futuras, então iremos utilizar um novo método: SceneManager.LoadScene.

Este método permite mudarmos de Scene passando o seu nome:

SceneManager.LoadScene(“MenuFases”);

Ou o seu index no Build do jogo:

SceneManager.LoadScene(1);

“Carlos como eu sei qual é esse index?”

Bem, lá no menu File, terá a opção Build Settings…

02- Tutorial Selecionar Fase

É aqui onde vocês escolhem para qual plataforma vocês vão gerar a versão jogável e em Scene in Build vocês escolhem as Scenes que serão exportadas para a versão jogável (Ou seja, se você não adicionar a Scene através do Add Open Scenes ou simplesmente arrastando a scene da aba Project para essa lista, está scene não estará na versão final do seu jogo e consequentemente dará erro ao tentar acessa-la)

03- Tutorial Selecionar Fase

Ali ao lado do nome de cada scene tem um número que começa do 0. Esse é o index da sua scene. Se quiser trocar a ordem, basta segurar a scene e arrasta-la para cima ou para baixo.

Podemos voltar agora ao nosso script. Bom, vocês já entenderam a ideia do SceneManager.LoadScene, porém para usa-lo precisamos chamar o pacote em que ele está, pois ele está no pacote padrão do Unity (É igual a questão dos scripts UI). Para usar essa função, temos que chamar o using UnityEngine.SceneManagement; no inicio do nosso script. Desta forma nosso script vai ficar assim:

Script: GCSelecaoPersonagem.cs

using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;

public class GCSelecaoPersonagem : MonoBehaviour {

    public void novoJogo() {
        var listaBotoes = FindObjectsOfType();
        var GCJogo = FindObjectOfType();

        foreach (var botao in listaBotoes) {
            if (botao.selecionado == true) {
                var status = botao.personagem.getStatus();
                var prefabPersonagem = botao.personagem.getNomePrefab();
                GCJogo.novoJogo(prefabPersonagem, status);
                break;
            }
        }
        SceneManager.LoadScene("MenuFases"); //ou SceneManager.LoadScene(1);
    }
}

E com isso você já pode dá play e testar, se ele está mudando de scene ou não. Vocês inclusive podem verificar se o objeto GCJogo continuar na Scene depois de mudar para outra Scene:

04- Tutorial Selecionar Fase

Isso ocorre por conta do DontDestroyOnLoad que usamos na aula passada, lembra?

Bom, agora sim vamos começar a montar a nossa nova Scene. De fundo vocês podem deixar em branco ou usar o Background que usamos no menu, fiquem a vontade, isso não terá relação alguma com esse post. Eu vou usar o background com as nuvens para deixar bonitinho.

Bom, agora vamos ao que realmente interessa. Eu pensei em criar uma mapa para adicionar ao nosso menu de fases, então fiz esse aqui baseado nos 4 tipos de fases que vamos ter (Floresta, Lago, Caverna e Montanhas):

mapa

Quem curtiu esse mapa e quer fazer o seu próprio. Na quarta da ooooutra semana teremos um post extra onde eu mostro como você pode fazer um mapa nesse estilo.

Após pegar essa imagem, a adicione na pasta Resources/sprites/variados como do tipo Sprite 2D:

05- Tutorial Selecionar Fase

Nessa pasta “variados” vamos colocar conteúdo que não se encaixem bem nas outras pastas, mas que não há necessidade de criar uma pasta para um único item. Embora a gente vá usar o mapa como um item UI, ele não será algo exatamente um HUD para o usuário ou menu, por isso preferir por em uma pasta separada.

Bom, nesta Scene eu penso em fazer duas coisas. Uma será a Seleção de Fase (Óbvio) e a outra que será conteúdo do post parte 9 desse tutorial é o Save. Ou seja, o jogador só vai poder salvar o seu progresso nessa tela também.
Sendo assim vamos fazer o mesmo esquema da Scene passada de criar os painéis para podermos chamar o painel de seleção de fase ou o painel de salvar fase.

Neste caso na aba Hierarchy crie um novo Painel (UI >> Panel) e renomeei para PainelSelecaoFases e também remova toda a opacidade (Canal Alfa lá no atributo color que você acessa através do Inspector) do painel.
Feito isto, dentro do PainelSelecaoFases, vamos adicionar uma imagem (UI >> Image) e chamaremos de mapa:

06- Tutorial Selecionar Fase

Nele vamos adicionar o sprite do mapa nos tamanhos 558×300 (widthxheight) ou outro tamanho que mantenham a dimensão correta da imagem:

07- Tutorial Selecionar Fase

A próxima ideia é agora adicionar a entrada para as fases. Com isso adicione mais uma imagem dentro do PainelSelecaoFases (UI >> Image) e troque o nome para Fase1. Aproveite e reduza o tamanho da imagem para um tamanho menor (Usei 30 width por 30 height) e o coloque próximo da Floresta:

08- Tutorial Selecionar Fase

A próxima ideia é criar outra imagem que represente o nosso personagem. Então adicionei mais uma Imagem ao PainelSelecaoFases, com o nome Personagem. Nele iremos modificar o tamanho (scale) do objeto para ficar igual a Fase1 (Ou seja, 30×30), o colocarei na mesma posição e por fim, adicionarei uma imagem que represente o nosso personagem (No meu caso o sprite Button_81):

09- Tutorial Selecionar Fase

Caso você coloque o objeto Personagem na aba Hierarchy acima da Fase1, a imagem do personagem ficará por trás da imagem Fase1 e não queremos isso queremos?

Bom, o próximo passo agora será criar os scripts de faça o objeto Personagem mover para as Fases e entrar na fase correspondente.

Sendo assim dentro da pasta scripts/controllers vamos criar um script (C#) chamado Fase (Sim, estou diminuindo o número de imagens no post, para não dá a impressão que o post está muito grande e assustar a galera… sabe de uma coisa, melhor não, fica mais claro para vocês com as imagens):

10- Tutorial Selecionar Fase

Nesse Script a ideia é mover o objeto Personagem para as demais fases e caso o personagem esteja em uma fase e aperte Enter, o jogo deve entrar na fase. Também temos que ter o cuidado se a fase já está liberada ou não! Sendo assim o nosso script vai ter as seguintes variáveis:

Script: Fase.cs

    public GameObject faseCima;         //A fase que o personagem vai ao apertar para cima
    public GameObject faseBaixo;        //A fase que o personagem vai ao apertar para baixo
    public GameObject faseEsquerda;     //A fase que o personagem vai ao apertar para esquera
    public GameObject faseDireita;      //A fase que o personagem vai ao apertar para direita
    public int nivel;                   //O nível da fase
    private bool faseLiberada;          //Verifica se o jogador já liberou essa fase
    public bool faseSelecionada;        //Se o jogador está nesta fase
    public Sprite spriteLiberada;       //Sprite da Fase Liberada
    public Sprite spriteBloqueada       //Sprite da fase bloqueada;
    public string scene;                //Nome da Scene/Fase que será carregada

Vamos as explicações. As variáveis faseCima, faseBaixo, faseEsquerda, faseDireita servem apenas para quando o jogador clicar na setinha pra cima, pra baixo, para esquerda ou direita ir para a fase que informamos.

Exemplo, estou na fase Floresta e quero ir para a fase Caverna que está a direita, então coloco ela na faseDireita. E a fase Lago que está abaixo da floresta no mapa, coloco faseBaixo. Caso queira manter um padrão linear: floresta -> lago -> caverna -> montanha. Você pode definir então cima e direita avança, e baixo e esquerda volta para a fase anterior, não há problema.

nivel define qual o nível atual da fase, ou seja a sua ordem. No nosso caso será floresta (nivel = 1), lago (nivel = 2), caverna (nivel = 3) e montanhas (nivel = 4).

faseLiberada, serve para verificar o jogador já completou a fase anterior a esta. Se lembra que no nosso GameStatus tem o faseLiberada (Só que lá é um inteiro) também? Então se o nivel dessa fase for menor ou igual ao faseLiberada lá no GameStatus, significa que está fase está liberada.

faseSelecionada serve apenas para a gente saber se o Personagem está nesta fase. Se tiver então os comandos de mover ou selecionar fase poderão ser executados.

As variáveis spriteLiberada e spriteBloqueada servem apenas para pôr o sprite correspondente a fase.

E por fim temos o nome da Scene que será chamada caso a pessoa tente acessar a fase.

Bom, agora no método Start vamos verificar se a fase está liberada ou não conforme falamos antes (Verificando através do GameStatus) e posteriormente já aplicamos o sprite correto:

Script: Fase.cs

    void Start () {
        var gameStatus = FindObjectOfType().getGameStatus();
        faseLiberada = (nivel <= gameStatus.faseLiberada);

        if (faseLiberada)
            GetComponent().sprite = spriteLiberada;
        else
            GetComponent().sprite = spriteBloqueada;
    }

Simples, né? Apenas se lembre que para acessar o script Image, temos que fazer a declaração do pacote adicionando o namespace lá no inicio do script (using UnityEngine.UI;)

Próximo passo é saber se o nosso personagem está ou não nessa fase. Para isso vamos precisar usar os métodos OnTriggerEnter2D, OnTriggerStay2D e OnTriggerExit2D. Caso não tenha visto a aula extra sobre programação, agora é a hora (http://jogosindie.com/tutorial-de-unity-2d-extra-programacao/)

Aqui basicamente vamos verificar se o Objeto Personagem entrou no mesmo espaço do Objeto Fase (OnTriggerEnter2D), então faseSelecionada recebe verdade. Caso o personagem saia (OnTriggerExit2D), faseSelecionada recebe falso. E caso o personagem esteja dentro, poderemos move-lo para as outras fases se o personagem apertar as setinhas. A ideia é simples, né? Então bora ver isso nos scripts:

Script: Fase.cs

    void OnTriggerEnter2D(Collider2D colisor) {
        if (colisor.name.Equals("Personagem"))
            faseSelecionada = true;
    }

    void OnTriggerExit2D(Collider2D colisor) { 
        if (colisor.name.Equals("Personagem"))
            faseSelecionada = false;
    }

Aqui apenas verificamos se o objeto que entrou no mesmo espaço do objeto Fase possui o nome “Personagem”. Eu recomendo mais aqui que usem tags ao invés de nomes, mas não usarei, pois irei disponibilizar o projeto para vocês e como vou disponibilizar a pasta zipada, será comum ela perder a marcação das tags e layers, porém em outros momentos não terá como eu não usar tags ou layers, então já fiquem atentos a isso.

Antes de continuarmos e fazermos o método OnTriggerStay2D, precisamos criar um script para o personagem se mover numa determinada velocidade. Neste caso, volte ao Unity e crie um script chamado PersonagemSelecaoFase:

12- Tutorial Selecionar Fase

Esse script será bem simples e pequeno, então só teremos basicamente 2 variáveis e uma única linha de comando no Update:

Script: PersonagemSelecaoFase.cs

using UnityEngine;
using System.Collections;

public class PersonagemSelecaoFase : MonoBehaviour {

    public float velocidade;
    public Vector3 destino;

	void Start () {
        destino = transform.position;
	}
	
	void Update () {
        transform.position = Vector3.MoveTowards(transform.position, destino, velocidade * Time.deltaTime);
	}
}

Esse script serve para mover o objeto Personagem, onde basicamente ele sai da sua posição atual até a posição destino em uma velocidade X através do método Vector3.MoveTowards. Esse método tem 3 parâmetros de entrada: posição inicial, posição final e velocidade. Então basicamente o que vamos é dizer que ele vai sair da posição onde está (transform.position), em direção a outro objeto fase (Ex: fasebaixo.transform.position), na velocidade informada (velocidade * Time.deltaTime).

Continuando nosso script Fase… agora irei mostra-los o script que fará o objeto Personagem sair de uma fase e ir até outra:

Script: Fase.cs

    void OnTriggerStay2D(Collider2D colisor) {
        if (colisor.name.Equals("Personagem")) {
            
            //Move
            var scriptPersonagem = colisor.GetComponent();
            if (Input.GetAxisRaw("Horizontal") > 0 && faseDireita != null) //Jogador apertou para Direita e faseDireita não é nula
                scriptPersonagem.destino = faseDireita.transform.position;
            if (Input.GetAxisRaw("Horizontal") < 0 && faseEsquerda != null) //Jogador apertou para Esquerda e faseEsquerda não é nula
                scriptPersonagem.destino = faseEsquerda.transform.position;
            if (Input.GetAxisRaw("Vertical") > 0 && faseCima != null) //Jogador apertou para Cima e faseCima não é nula
                scriptPersonagem.destino = faseCima.transform.position;
            if (Input.GetAxisRaw("Vertical") < 0 && faseBaixo != null) //Jogador apertou para Baixo e faseBaixo não é nula
                scriptPersonagem.destino = faseBaixo.transform.position;
        }
    }

Primeiro verificamos se é realmente o personagem aquele colisor . Se for, recuperamos o script PersonagemSelecaoFase que deve estar nele e fazemos as verificações se o jogador apertou para o personagem se mover em uma das 4 direções e se a direção que o jogador apertou também foi informada ou não no script.

Caso tenha sido, então informamos para o script PersonagemSelecaoFase que o destino do personagem é a posição da fase informada.

Bom, agora vou criar um método para fazer a chamada da fase informada e neste método também farei a verificação se a fase está liberada ou não:

Script: Fase.cs

    public void  abreFase() {
        if (faseLiberada)
            SceneManager.LoadScene(scene);
    }

Aqui apenas verifiquei se a fase estava ou não liberada e em seguida, pedi para abrir a scene informada. E lembre-se de que para usar a classe SceneManager, temos que chamar seu namespace lá no inicio do código (using UnityEngine.SceneManagement;). E caso tenham ficado curiosos porque eu coloquei esse método como public? É porque assim, caso quisermos criar um botão “Selecionar Fase”, podemos apenas chamar esse método para carregar a fase.

Estamos quase acabando o script. Agora Podemos também lá no OnTriggerStay2D, verificar se o jogador apertou Enter (Submit). Caso sim, então podemos chamar o método abreFase():

Script: Fase.cs

    void OnTriggerStay2D(Collider2D colisor) {
        if (colisor.name.Equals("Personagem")) {
            
            //Move
            var scriptPersonagem = colisor.GetComponent();
            if (Input.GetAxisRaw("Horizontal") > 0 && faseDireita != null) //Jogador apertou para Direita e faseDireita não é nula
                scriptPersonagem.destino = faseDireita.transform.position;
            if (Input.GetAxisRaw("Horizontal") < 0 && faseEsquerda != null) //Jogador apertou para Esquerda e faseEsquerda não é nula
                scriptPersonagem.destino = faseEsquerda.transform.position;
            if (Input.GetAxisRaw("Vertical") > 0 && faseCima != null) //Jogador apertou para Cima e faseCima não é nula
                scriptPersonagem.destino = faseCima.transform.position;
            if (Input.GetAxisRaw("Vertical") < 0 && faseBaixo != null) //Jogador apertou para Baixo e faseBaixo não é nula
                scriptPersonagem.destino = faseBaixo.transform.position;

            if (Input.GetButtonDown("Submit"))  //Jogador apertou Enter
                abreFase(); 
        }
    }

A variável velocidade é igual à velocidade do jogador, ou seja, serve para informar qual a velocidade que o personagem vai se locomover de um ponto a outro do mapa.

Acabamos esse script e para não ficar dúvida por conta dos namespaces lá em cima, vai o código inteiro aqui:

Script: Fase.cs

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;

public class Fase : MonoBehaviour {

    public GameObject faseCima;         //A fase que o personagem vai ao apertar para cima
    public GameObject faseBaixo;        //A fase que o personagem vai ao apertar para baixo
    public GameObject faseEsquerda;     //A fase que o personagem vai ao apertar para esquera
    public GameObject faseDireita;      //A fase que o personagem vai ao apertar para direita

    public int nivel;                   //O nível da fase
    private bool faseLiberada;          //Verifica se o jogador já liberou essa fase
    public bool faseSelecionada;        //Se o jogador está nesta fase
    public string scene;                //Nome da Scene/Fase que será carregada

    public Sprite spriteLiberada;       //Sprite da Fase Liberada
    public Sprite spriteBloqueada;       //Sprite da fase bloqueada;

    void Start () {
        var gameStatus = FindObjectOfType().getGameStatus();
        faseLiberada = (nivel >= gameStatus.faseLiberada);

        if (faseLiberada)
            GetComponent().sprite = spriteLiberada;
        else
            GetComponent().sprite = spriteBloqueada;
    }

    void OnTriggerEnter2D(Collider2D colisor) {
        if (colisor.name.Equals("Personagem"))
            faseSelecionada = true;
    }

    void OnTriggerExit2D(Collider2D colisor) {
        if (colisor.name.Equals("Personagem"))
            faseSelecionada = false;
    }

    void OnTriggerStay2D(Collider2D colisor) {
        if (colisor.name.Equals("Personagem")) {

            //Move
            var scriptPersonagem = colisor.GetComponent();
            if (Input.GetAxisRaw("Horizontal") > 0 && faseDireita != null) //Jogador apertou para Direita e faseDireita não é nula
                scriptPersonagem.destino = faseDireita.transform.position;
            if (Input.GetAxisRaw("Horizontal") < 0 && faseEsquerda != null) //Jogador apertou para Esquerda e faseEsquerda não é nula
                scriptPersonagem.destino = faseEsquerda.transform.position;
            if (Input.GetAxisRaw("Vertical") > 0 && faseCima != null) //Jogador apertou para Cima e faseCima não é nula
                scriptPersonagem.destino = faseCima.transform.position;
            if (Input.GetAxisRaw("Vertical") < 0 && faseBaixo != null) //Jogador apertou para Baixo e faseBaixo não é nula
                scriptPersonagem.destino = faseBaixo.transform.position;

            if (Input.GetButtonDown("Submit"))  //Jogador apertou Enter
                abreFase(); 
        }
    }

    public void  abreFase() {
        if (faseLiberada)
            SceneManager.LoadScene(scene);
    }
}

Com isso já finalizamos nosso script. Vamos voltar ao Unity e duplicar aquela Fase1 lá mais 3 vezes, renomeando para Fase2, Fase3 e Fase4 e os posicionando em seus devidos locais:

11- Tutorial Selecionar Fase

Aqui já pode adicionar o Script Fase no objeto Fase1, informar quem são seus vizinhos (faseDireita = Fase3 e faseBaixo = Fase2), informar o nivel (Nível 1, primeira fase) e em scene, como ainda não temos nenhuma fase, podemos dizer para ele ir para o menu informando o nome da scene Main. Os Sprites que eu utilizei foram o Button_38 e Button_40:

13- Tutorial Selecionar Fase

Verde para fase liberada e cinza para fase bloqueada.

14- Tutorial Selecionar Fase

Próximo passo é adicionar BoxCollider2D em todos objetos Fase1, Fase2, Fase3, Fase4 e Personagem. Tenha cuidado para verificar se o Box Collider 2D está realmente do tamanho do objeto (30x30). Todas as Box Collider 2D tem que está com o Is Trigger marcado. E para finalizar, vou pedir ainda que vocês adicionem o Rigidbody2D no objeto Personagem para os Colliders “Is Trigger” funcionarem. Para a física não ter efeito sobre o botão se lembrem de marcar a opção Is Kinematic:

15- Tutorial Selecionar Fase

Agora é a vez de adicionar o Script PersonagemSelecaoFase ao objeto Personagem, informando uma velocidade boa (100 ou mais).

16- Tutorial Selecionar Fase

Feito isto, repita os processos com as outras Fases, informando quem são as suas vizinhas, os botões e níveis. Então teste o jogo. Lembrando que para testar o jogo tem que iniciar na Scene Main por conta do GCJogo:

17- Tutorial Selecionar Fase 18- Tutorial Selecionar Fase 19- Tutorial Selecionar Fase

Se tiver tudo certo ao clicar nas setinhas ou nas letras wasd, seu personagem já deve se mover:

20- Tutorial Selecionar Fase

E reparem também que apenas a Floresta está liberada, por isso é verde. Ao clicar no Enter nela, ela voltará para a tela do Menu Principal e podemos então ver nosso primeiro bug!

Ao voltar para a tela principal, o nosso GCJogo fica duplicado, já que ele não é destruindo de uma scene para outra:

21- Tutorial Selecionar Fase

Então vamos alterar o Script GCJogo, de forma a verificar se já existe algum outro objeto com esse script. Caso tenha mais de um, destruímos o que está sendo construído agora:

Script: GCJogo.cs

using UnityEngine;
using System.Collections;

public class GCJogo : MonoBehaviour {

    private GameStatus gameStatus;

	void Start () {
        gameStatus = new GameStatus();
        DontDestroyOnLoad(this.gameObject);

        if (FindObjectsOfType().Length > 1)
            Destroy(gameObject);
	}
...

Nós já vimos que o FindObjetcSSSSSofType retorna uma lista de todos os objetos na scene com esse script não é mesmo? Então só precisamos verificar se essa lista tem mais de um objeto (A gente sabe a quantidade de objetos através do Lenght). Simples!

Bom, se estiver tudo certo, já podemos voltar a nossa scene MenuFases. Basicamente nosso post poderia terminar aqui, porém vou pedir para vocês adicionarem 3 botões a esse PainelSelecaoFases (BotaoSelecionarFase, BotaoSalvar, BotaoMenuPrincipal):

22- Tutorial Selecionar Fase

O botão Salvar, iremos apenas trabalhar com ele no próximo post quando formos aprender a salvar o GameStatus do seu jogo. O Menu Principal é um botão simples, que vai receber o método que abre o menu principal do jogo. Já o Botão Selecionar Fase, ficará encarregado de buscar todos os objetos que tiverem o script Fase, verificar se o script está com a faseSelecionada (Se lembrem que essa variável é publica) e depois chamar o método abreFase (Que também é público).

Aqui não temos nada novo, então quero deixar isso como desafio para vocês relembrarem a aula passada. Eu já disse o que cada botão tem que ser feito não é mesmo? Todavia irei informar o nome da classe e dos métodos, pois iremos utiliza-la no próximo tutorial.

Neste caso, crie um script chamado GCSelacaoFase:

23- Tutorial Selecionar Fase

Abaixo segue a estrutura do script (Vejam, que já adicionei os namespaces do SceneManager e dos scripts UI):

Script: GCSelacaoFase.cs

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;

public class GCSelecaoFase : MonoBehaviour {

	
    public void botaoSelecionarFase() {

    }

    public void botaoMenuPrincipal() {

    }

    public void botaoSalvar() {

    }
}

Agora, de volta ao Unity, crie um objeto com nome GC com este script:

24- Tutorial Selecionar Fase

Agora o resto é com vocês. Para quem tiver dificuldade ou preguiça, abaixo vou disponibilizar o script já com os códigos. Ele também estará disponível no projeto no final para download, mas peço realmente que ao menos tentem, para fixar na cabeça de vocês os comandos e melhorar o pensamento lógico de vocês. Eu já falei lá em cima como deve ser feito, então tentem transformar aquilo em código ok?
...
...
...
E aqui segue o código para os que tiveram preguiça, pois eu sei que vocês conseguem u.u:

Script: GCSelacaoFase.cs

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;

public class GCSelecaoFase : MonoBehaviour {

	
    public void botaoSelecionarFase() {
        var listaDeFases = FindObjectsOfType(); //Recupera todos os objetos com o script Fase nessa Scene

        foreach (var fase in listaDeFases) {
            if (fase.faseSelecionada)           //Verifica se é a fase selecionada
                fase.abreFase();                //Abre a fase, caso esteja liberada
        }
    }

    public void botaoMenuPrincipal() {
        SceneManager.LoadScene("Main"); //Simples, viu? Vai dizer que não consegue?
    }

    public void botaoSalvar() {

    }
}

E terminamos mais um tutorial o/. Este foi o menor que teve até agora? É porque eu economizei nas imagens. Vou ver se diminui um pouco os print’s sem prejudicar tanto vocês.

Espero que tenham gostado e qualquer dúvida já sabem, deixem ai nos comentários.

Índice Tutorial Intermediário
Download do Projeto
Download do Jogo

Criador do Jogos Indie, amante de jogos, terror, música, anime e programação. Estudante de mestrado com foco em jogos na educação. Louco por Resident Evil e... sei lá, acho que é isso O.o

15 comments

  1. Bruno Souza disse:

    Boa tarde Carlos,

    Primeiramente parabéns pelos tutoriais, estou seguindo cada passo, muito bom.
    O que eu queria perguntar pra você, é que estou seguindo seu tutorial e estou tentando fazer meu jogo a parte em paralelo. Porém, estou tentando fazer meu jogo para Android, você acha que consigo normal fazer meu jogo seguindo o seu tutorial (que imagino que seria pra plataforma PC)? É que para Android tem as ações de touch, o código dos comandos seriam diferente, e nas partes finais exportaria ele para Android.

    Para exportar Android precisa de alguma coisa a mais? É pq vejo poucos tutorias que ensinam jogos
    para Android.

    • Olha bruno. A parte de UI não muda absolutamente nada, mas a parte de movimentação do seu personagem muda por completo sim.

      Você teria que criar uns botões para andar nas direções e atacar,como alguns jogos fazem ou pegar a posição da tela onde o jogador tocou que é um pouco mais complicado.

      Quanto a exportação, não precisa de nada demais não. O Unity exporta a aplicação para apk que é lida no Android, mas eu nunca cheguei a por nada no meu celular para testar.

  2. Deyvid Lira disse:

    Não sei o por que, mas o OnTriggerStay2D funcionava desde que eu estivesse pressionando as teclas, se eu deixasse sem mexer ele depois de um tempo parava de executar o que impedia o movimento. Ai criei mais duas variáveis e tratei a verificação para mover em update.

    • Rapaz comigo não deu problema, mas acho que sei o que é o seu problema =P

      Eu percebi isso em uns posts que vão sair mais na frente. Nos inimigos eu acho. Se objeto tiver um Rigidbody2D na opção Sleeping Mode, marque a opção Never Sleep. Com a opção Sleep ativada, caso seu objeto fique parado por um tempo, ele desabilita o Rigidbody, consequentimente os collideres. Essa opção é uma forma de ganhar desempenho, mas as vezes atrapalha.

  3. Deyvid Lira disse:

    Ah obrigado, foi isso mesmo. Interessante saber disso. \o/

  4. Deu o mesmo problema aqui, fazendo isso resolveu.

  5. Opa, primeiramente gostaria de dizer que tu é muito foda e queria agradecer por esse tutorial.
    Mas, (kk sempre tem um “mas”) O meu personagem do mapa não está andando. Eu aperto os botões e tudo mas ele não se move, para ter certeza que os scripts estavam certos eu copiei Ctrl+C Ctrl+V. Parece que o problema não é nos scripts, o que você acha que pode ser? .-.
    (Eu também olhei para ver se eu havia deixado os mapas nos “baixo”,”cima” e “etc”. Está certo, será que pode ser o nome de alguma coisa ou talvez um botão não selecionado?)

    • Nessa caso Andrei, pode ser:
      1 – que o personagem esteja sem o script PersonagemSelecaoFase (Ou não foi informado a velocidade que ele deve andar)

      2- O objeto do personagem possua um nome diferente de “Personagem” (Acredito que seja esse)

  6. O pior é que isso está certo…
    No momento estou fazendo o download do projeto para comparar todas as coisas.
    Obrigado por responder e mais uma vez agradeço pelo seu tutorial incrível! Eu vou achar o que está causando isso e dai eu coloco o que estava errado aqui.

  7. Opa, fiz download do projeto e nem o do projeto ta se movendo. Acha que pode ser um problema com os botões? Tipo, eu olhei naquele “Edit>Project Settings>Input” e ta tudo certo “Horizontal> Negative=Left / Positive=Right” Acha que pode ter alguma outra coisa que impede de funcionar? .-.

  8. Será que tem um jeito de escolher a faze clicando em cima? XD

    • Opa Lucas.

      Se você quer que o personagem se mova ao clicar na fase, basta mudar a fase para ser um UI.Button, ao invés de uma imagem.

      E ao invés de fazer ele se mover ao clicar num botão direcionar, faz quando ocorre um clique especifico na fase.

  9. Daniel H.S. disse:

    O meu também tava dando pau, ai eu desabilitei o is Kinematic do personagem e ele anda e entra nas fases

  10. Daniel H.S. disse:

    uma maneira melhor e nao da bug, deixa o is knematic ligado, vai no rigidbody2d do personagem e na opção sleep mode coloca naver Sleep, no meu deu certo

Deixe uma resposta

Parceiros

Steam Brasil LoboLimão Centro RPG Lab Indie
Mundo Gamer PodTerror

Anunciantes

Aglomerando - Agregador de conteúdo
Uêba - Os Melhores Links GeraLinks - Agregador de links Piadas Idiotas - São idiotas mas o faz rir Tedioso: Os melhores links LinkLog MeusLinks.com - Informação e conteúdo todos os dias para você! Agregador de Links - Madruga Links 4Blogs - Agregador de conteúdo Está no seu momento de descanso né? Entao clique aqui!