De uma Cena para Outra: Como Gerenciar Níveis e Menus na Unity

Você criou seu menu principal com botões funcionais. Você construiu sua primeira fase, cheia de desafios e mecânicas interessantes. Agora vem a pergunta que conecta tudo: como eu faço o botão “Iniciar Jogo” levar o jogador para a fase? E como eu volto para o menu depois de um “Game Over”?

A resposta está em uma das ferramentas mais importantes da Unity para estruturar seu projeto: o SceneManager.

Gerenciar cenas pode parecer complexo, mas a lógica é bastante direta. Neste guia, vamos aprender a usar o SceneManager para carregar cenas, reiniciar fases e organizar a navegação do seu jogo de forma simples e profissional.

1. A Etapa Mais Importante (e Mais Esquecida): O Build Settings

Antes de escrever uma única linha de código para carregar uma cena, você precisa fazer algo crucial: “avisar” a Unity que essa cena faz parte do seu jogo final. Se você pular esta etapa, seu código não funcionará.

  1. No menu superior, vá em File > Build Settings....
  2. Uma nova janela se abrirá. No topo, há uma lista chamada “Scenes In Build”.
  3. Com suas cenas do menu e das fases salvas, você pode clicar em “Add Open Scenes” para adicionar a cena que está aberta no momento, ou simplesmente arrastar os arquivos das cenas do seu painel de “Project” para dentro desta lista.

Ao adicionar as cenas, você notará que cada uma recebe um número à direita (0, 1, 2…). Este é o índice de build. A cena com índice 0 é, por padrão, a primeira a ser carregada quando alguém abre seu jogo. Portanto, certifique-se de que a sua cena de menu principal esteja no topo da lista (índice 0).

2. Carregando Cenas com o SceneManager

Agora que a Unity conhece nossas cenas, podemos carregá-las via script.

Passo 2.1: O using Essencial Para ter acesso às funções de gerenciamento de cena, você precisa adicionar a seguinte linha no topo do seu script:

using UnityEngine.SceneManagement;

Passo 2.2: Carregando uma Cena Existem duas formas principais de carregar uma cena: pelo nome ou pelo índice.

A) Carregar por Nome (Método Recomendado) Esta é a forma mais legível e segura contra erros de reorganização.

// Carrega a cena chamada "Fase1"
SceneManager.LoadScene("Fase1");

Vantagem: Seu código continua funcionando mesmo que você mude a ordem das cenas no Build Settings. Desvantagem: Você precisa garantir que o nome da cena no código seja exatamente igual ao nome do arquivo da cena.

B) Carregar por Índice Você também pode carregar usando o índice que vimos no Build Settings.

// Carrega a cena de índice 1 na lista do Build Settings
SceneManager.LoadScene(1);

Vantagem: É rápido e não depende de nomes. Desvantagem: Se você reorganizar a ordem das cenas no Build Settings, este código pode passar a carregar a cena errada. Use com cuidado.

3. Funções Úteis para Navegação

O SceneManager oferece mais do que apenas carregar a próxima cena.

Como Reiniciar a Fase Atual? Ideal para um botão “Tentar Novamente” em uma tela de Game Over.

public void ReiniciarFase() {
    // Pega o índice da cena que está atualmente carregada
    int cenaAtualIndex = SceneManager.GetActiveScene().buildIndex;

    // Recarrega a cena usando o índice que acabamos de pegar
    SceneManager.LoadScene(cenaAtualIndex);
}

Como Carregar a Próxima Fase em Ordem? Perfeito para quando o jogador chega ao final de um nível.

public void CarregarProximaFase() {

    int proximaCenaIndex = SceneManager.GetActiveScene().buildIndex + 1;

    // Cuidado: Verifique se a próxima cena realmente existe
    if (proximaCenaIndex < SceneManager.sceneCountInBuildSettings) {
        SceneManager.LoadScene(proximaCenaIndex);
    } else {
        Debug.Log("Fim de jogo! Voltando ao menu.");
        // Ou carregue a cena dos créditos, ou a do menu principal
        SceneManager.LoadScene("MenuPrincipal"); 
    }

}

4. Uma Breve Introdução ao Carregamento Assíncrono

Você já notou que, ao carregar um nível, o jogo às vezes congela por um instante? Isso acontece porque SceneManager.LoadScene() é uma operação síncrona: ela pausa tudo até que a nova cena esteja totalmente carregada.

Para níveis grandes, a melhor abordagem é usar o carregamento assíncrono.

SceneManager.LoadSceneAsync("FaseGrande");

Esta função começa a carregar a cena nos “bastidores”, sem travar o jogo. Isso permite que você mantenha uma tela de “Loading…” ativa e até mesmo exiba uma barra de progresso para o jogador. Embora a implementação de uma barra de progresso seja um pouco mais complexa, saber que LoadSceneAsync existe é o primeiro passo para criar transições mais suaves em jogos maiores.

Conclusão

Gerenciar cenas é o que transforma um conjunto de níveis isolados em um jogo coeso, com um fluxo claro e uma navegação para o jogador. É a estrutura que conecta o início, o meio e o fim da experiência que você está construindo.

Dominar o SceneManager é um passo fundamental para sair do modo “protótipo de uma fase só” e entrar no modo “produto completo”.

Gostou de aprender a estruturar seu jogo? Em nosso canal no YouTube, a PERAI DEV, montamos projetos do zero, passando por todas essas etapas. Inscreva-se para não perder nenhum detalhe do processo!

Compartilhe !