Menu

08.5 – Tutorial Intermediário – Criando Música

E aê galera? Tudo pronto para mais um tutorialzinho extra? Na realidade esse será mais um post de indicação do que tutorial, pois será sobre áudio e eu não manjo nada sobre áudio :X, mas é uma ferramenta boa para quem entender e para quem não entende, então bora lá!

Leia Mais…

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:

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…

É 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)

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:

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):

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:

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:

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

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:

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):

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):

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:

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:

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:

Verde para fase liberada e cinza para fase bloqueada.

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:

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

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:

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

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:

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):

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:

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:

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

Impeachman – Mobile

 

Continuando com os nossos jogos para mobile e com a grande onda de Impeachment, que o  Brasil tem passado, conheçam o jogo Impeachman!

Leia Mais…

07 – Tutorial Intermediário – Escolhendo Personagem

E aê indies, preparados para mais um tutorial? No post de hoje vamos aprender como fazer uma tela de seleção de personagens!

Leia Mais…

Quinta do Terror – Darksiders

Aoooowwww moçada, hoje saiu mais uma creepy para seu deleite, espero que gostem, aquele abraço.

Leia Mais…

06.5 – Tutorial Intermediário – Construindo Pixel Art

E aê galerinha, tudo joia? Hoje o tutorial será um extra, por isso será beeeem curtinho e se quiser pode até pular. Mas iremos conhecer uma ferramenta para desenhos em pixel art.

Leia Mais…

Terça Musical – Música com Mario Paint

E quem disse que não dá para fazer musicas legais no Mario Paint?

 

Bônus – Get Lucky

 

06 – Tutorial Intermediário – Menu Principal

E aê meus queridos indies? Prontos para mais um tutorial? Acho que estamos indo muito rápido, mas levem o tempo que acharem necessário. O post de hoje será o maior de todo o tutorial, maaaas vamos começar a aprender as novidades do Unity 5, que não vimos no 4.6, o Canvas!

Leia Mais…

Pampli – Mobile

Como disse vou voltando aos poucos com as postagens e uma das postagens são os jogos para mobile! O jogo é o velho clássico dos canos, porém com um desafio real (Afinal o original é muito fácil), então se você achava difícil hackear em BioShock, conheça Plampi.

Leia Mais…

05 – Tutorial Intermediário – Personagem 2 – Habilidade

E aqui estamos para mais um tutorial! Desta vez vamos criar as habilidades da nossa querida ninja!

Leia Mais…

Página 7 de 54« Primeira...56789...203040...Última »

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!