Menu

15 – Tutorial Intermediário – Loading

Vamos agora criar um pequeno post de como fazer aquelas telas de loading. Esse post na realidade não iria entrar, entrou apenas quando eu estava criando o post do cenário 1, que eu pensei na possibilidade de que vocês poderiam criar um cenário tão grande que o jogo ficaria travado até ele carrega por completo a fase do jogo.

No nosso tutorial ele não terá tanta utilidade e será uma tela super rápida, pois os cenários são pequenos, por isso carregam beem rápidos, mas ainda é interessante vocês verem isso, para caso criem cenários maiores.

Bom, eu já falei o que acontece quando o Unity tenta carregar um cenário logo grande, certo? O jogo fica lá travado, então o ideal é criar uma scene simples com quase nada que carregue super rápido. E ela é que irá fazer a chamada para a Scene mais pesada que demora um tempinho.

Esse tutorial é pequeno e não vou enfeitar tanto, vou fazer algo simples mesmo já que ele não estava previsto (Considerem como um bônus).

Então a ideia é que quando chegar lá na Scene de MenuFases, mais precisamente no script Fase que ficam nos desenhos das fases, iremos modificar o método:

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

Aqui, ao invés de nós carregarmos diretamente a scene que a pessoa escolheu, nós iremos carregar uma Scene chamada Loading, que ainda vamos criar. Só que antes precisamos passar a informação de qual é a scene que ele deve carregar, não é mesmo?

Ai eu te pergunto, como é que a gente fez isso até agora? Qual é o Script que está presente em todas as Scenes que salva a informação entre elas? Sim, isso mesmo meu caro. É o GCJogo! Nele basicamente vamos adicionar uma variável pública do tipo string com o nome sceneLoading:

Script: GCJogo.cs

using UnityEngine;
using System.Collections;

public class GCJogo : MonoBehaviour {

    private GameStatus gameStatus;
    public string sceneLoading; //Scene para usar no Loading
...

Essa variável terá o único papel de salvar uma informação da scene selecionada em MenuFases para a scene Loading.
Salva e bora voltar para o script Fase e alterar aquele método lá, informando qual é a scene que será carregada no Loading e chamamos a scene Loading:

Script: Fase.cs

    public void  abreFase() {
        if (faseLiberada) {
            var GCJogo = FindObjectOfType();
            GCJogo.sceneLoading = scene;
            SceneManager.LoadScene("Loading");
        }       
    }

Prontinho, já acabamos por aqui! Agora vamos criar uma nova Scene com o nome Loading:

34- Tutorial Loading

Bom, aqui como eu falei, é criar uma scene leve e simples, para que seu loading não precise de loading, não é mesmo? Então pode adicionar um texto, uma imagem, algumas coisinhas, mas nada pesado, ok?
Eu vou alterar o fundo do meu cenário para preto através da câmera:

35- Tutorial Loading

Depois vou apenas adicionar um texto Canvas com o nome Carregando (TextoCarregando), a Logo do Jogos Indie (Logo) e um Slider (BarraDeProgresso) sem interação e a bolinha:

36- Tutorial Loading

A barra de progresso eu fiz sem fundo (Removi o Background) e deixei ela esticava nas laterais:

37- Tutorial Loading

Assim o jogador já sabe que o carregamento vai do inicio ao fim da tela:

38- Tutorial Loading

Agora, só precisamos criar um script chamado GCLoading dentro da pasta scripts/controllers. Esse script é beeeeem simples. Tão simples que vocês vão ficar besta.

Basicamente vamos chamar os namespace UnityEngine.SceneManagement e UnityEngine.UI, afinal vamos trabalhar com o Slider e com o SceneManager.

De variável só teremos duas, uma do privada do tipo AsyncOperation e outra para o Slider:

Script: GCLoading.cs

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

public class GCLoading : MonoBehaviour {

    private AsyncOperation carregamento;
    public Slider barraDeProgresso;
}

A variável barraDeProgresso do tipo Slider, você já devem saber o que vamos fazer, vamos usa-la para atualizar lá a nossa barrinha de loading.

Já o AsyncOperation é novo para vocês, mas basicamente ele serve para saber o progresso do carregamento da fase, se ela já carregou ou se é para abrir a fase assim que ela tiver sido carregada.

Continuando, no nosso método Start, vamos buscar o nome da scene que é para carregar e pedir para que a fase comece a ser carregada de forma Assíncrona, através do SceneManager.LoadSceneAsync. Ao carregar uma scene de forma assíncrona, o jogo não trava enquanto carrega a scene. O jogador ainda pode ficar clicando e mexendo no jogo como se nada tivesse acontecido. O problema é que se a gente usar isso na scene MenuFases, o jogador vai pensar que a fase que não clicou ou aconteceu nada e vai ficar apertando para carregar a fase varias e varias vezes ou achar que o jogo bugou, por isso que usamos isso nas telas de loading onde o jogador não pode sair clicando e ainda verá o carregamento da scene.

Falando em carregamento… o SceneManager.LoadSceneAsync retorna uma variável do tipo AsyncOperation, que iremos guardar na variável carregamento:

Script: GCLoading.cs

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

public class GCLoading : MonoBehaviour {

    private AsyncOperation carregamento;
    public Slider barraDeProgresso;

    void Start () {
        var scene = FindObjectOfType().sceneLoading;
        carregamento = SceneManager.LoadSceneAsync(scene);
	}
}

E para finalizar no método Update, vamos informar o progresso do carregamento da scene no slider barraDeProgresso:

Script: GCLoading.cs

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

public class GCLoading : MonoBehaviour {

    private AsyncOperation carregamento;
    public Slider barraDeProgresso;

    void Start () {
        var scene = FindObjectOfType().sceneLoading;
        carregamento = SceneManager.LoadSceneAsync(scene);
	}
	
	void Update () {
        barraDeProgresso.value = carregamento.progress;
	}
}

Bem simples, né? Guardamos o progresso na variável carregamento, depois o verificamos através da variável “progress”. Esse progress vai de 0 a 1, onde 0 é 0% e 1 é 100%. Assim que o progresso chegar a 100, a fase já é chamada automaticamente.

Agora é só voltar ao editor do Unity, na aba Hierarchy criar um objeto chamado GC e adicionar o script GCLoading informando quem é a Barra de Progresso:

39- Tutorial Loading

Já pode salvar e dá play para testar seu jogo. (Se lembrem de adicionar a Scene Loading no File >> Building Setting…):

40- Tutorial Loading

Quando vocês testarem, o Loading da Scene será tão rápido, que mal vocês vão ver a tela de loading, então como falei para esse tutorial não teria tanta importância, mas como é algo que será bastante útil independente do estilo de jogo (3D, 2D, corrida, terror, aventura…), então resolvi criar esse post a mais. ^^

41- Tutorial Loading

Por hoje é só pessoal, até mais e um abraço!

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

One comment

  1. Fernando disse:

    Muito Obrigado Carlos, eu estou adorando os seus tutoriais e estou ansioso para o próximo. Isso ai Carlos você esta ajudando muitas pessoas a realizarem o sonho de ser um desenvolvedor de games MUITO OBRIGADO!!!

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!