A utilização de cenas é um recurso comum durante a construção de jogos, principalmente para representar fases ou diferentes estados de um jogo (menu, ingame, loja e etc.). Ao iniciar um novo projeto na Unity uma nova cena é criada automaticamente no projeto, chamada de SampleScene.
|
Cena inicial disponível ao criado o projeto
|
Para manter o nosso projeto organizado, vamos alterar o nome desta cena inicial (
SampleScene) para
Fase 1, assim como posteriormente alteraremos a pasta
Scenes para
Cenas.
|
Renomeando cena |
Antes de implementarmos nosso script para realizar a transição (navegação) entre as cenas, vamos alterar o visual da cena Fase 1, adicionando uma interface (UI) com um botão e uma mensagem informativa sobre o funcionamento da cena.
Na construção da interface (UI) deste exemplo, nós vamos utilizar o
UI Pack: Space extension desenvolvido pelo
Kenney.nl, que pode ser baixado no
OpenGameArt.org. O link para download de todo o projeto desenvolvido está disponível
aqui e, como sempre, no fim do post.
Com o objetivo de manter o nosso projeto organizado, separados os Assets importados a partir do UI Pack: Space extension em duas pastas Fontes e Sprites, contendo respectivamente as fontes (para exibição de texto) e as imagens que serão utilizadas no projeto.
|
Estrutura de pastas após a importação dos Assets
|
Utilizando os
Assets importados, construímos a seguinte interface para a
Fase 1:
|
Interface com instruções, desenvolvida para a Fase 1
|
Nosso próximo passo é criar uma nova cena, para iniciarmos a implementação da lógica de transição.
Para criar uma nova cena para ir na opção File e em seguida clicar em New Scene, ou utilizar o atalho Ctrl + N.
|
Criação de uma nova cena
|
Após criada, a nova cena deverá ser salva com o nome Menu, dentro da pasta Cenas, conforme abaixo:
|
Salvar cena Menu
|
Vamos alterar também o visual da cena Menu para instruir o jogador sobre o seu funcionamento.
|
Interface do Menu
|
Agora que temos pelo menos duas cenas (Menu e Fase 1), podemos implementar e testar o nosso script para navegar entre cenas. Sendo assim, o nosso primeiro passo é criar um script chamado FluxoCena, no qual implementaremos toda a lógica para navegar entre cenas.
Para o desenvolvimento do script FluxoCena nós não precisaremos dos métodos Start e Update que são automaticamente adicionados sempre que um novo script é criado. Ou seja, após apagar o métodos Start e Update, nosso scripti FluxoCena estará da seguinte forma:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FluxoCena : MonoBehaviour
{
}
Legal! Já temos o nosso script. Precisamos agora implementar a lógica de transição entre cenas.
A transição entre cenas na Unity é controlada por uma classe chamada SceneManager (gerenciador de cena) que pertence ao pacote (namespace no C#) UnityEngine.SceneManagement. Sendo assim, para utilizar o ScenerManager, precisamos primeiro dizer para a Unity que vamos precisar do pacote SceneManagement em nossa classe. Isso pode ser feito de uma forma bem simples, adicionando a declaração using UnityEngine.SceneManagement; antes da definição da nossa classe, no script FluxoCena, conforme abaixo:
Importando o SceneManagement
using UnityEngine.SceneManagement;
Código completo do script FluxoCena até o momento:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class FluxoCena : MonoBehaviour
{
}
Agora que já importamos o SceneManagement, podemos utilizar a classe SceneManager para alterar a cena atual do jogo e permitir que o jogador navegue entre diferentes fases/cenas. Para ir para outra cena do jogo, é necessário que a nova cena seja carregada pela Unity, antes de ser exibida para o jogador. Para carregar uma cena basta utilizar o método LoadScene da classe SceneManager através do comando SceneManager.LoadScene("nome da cena"); onde o nome da cena deve ser o mesmo de uma das cenas que criamos anteriormente na Unity.
No nosso exemplo, a chamada para o método LoadScene deverá ser realizada após pressionada um botão na interface do Menu ou da Fase 1, como pode ser observado nas imagens das interfaces exibidas anteriormente. Dessa forma, podemos implementar o nosso script FluxoCena para possuir um método Mudar que mudará a cena atual do jogo, quando o botão de uma das cenas for clicado, levando o jogador para uma nova cena.
Resumindo:
- O jogador clica no botão do Menu;
- O botão executa o método Mudar do script FluxoCena;
- O método Mudar executa o LoadScene;
- O jogo muda para a cena Fase 1.
O que você achou? Simples. Não é?
Obs: Essa transição de cena também pode acontecer da cena Fase 1 para o Menu, se alterarmos a ordem das cenas no exemplo anterior. Ok?
Seguindo essa lógica, podemos implementar o nosso script FluxoCena da seguinte forma:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class FluxoCena : MonoBehaviour
{
[SerializeField]
private string nomeCena;
public void Mudar() {
SceneManager.LoadScene(this.nomeCena);
}
}
Espera! Eu entendi a parte do LoadScene, mas por que nós precisamos criar a variável nomeCena, se a gente pode simplesmente digitar o nome da cena diretamente no método Mudar?
Ah, sim! Boa pergunta. Pense comigo...se colocarmos o nome da cena fixo dentro do método Mudar, nós teremos duas opções:
- Criar um novo método para cada nova transição de cena (MudarFase1, MudarMenu e etc.);
- Criar uma nova classe para cada nova transição de cena (FluxoCenaFase1, FluxoCenaMenu e etc.), para que cada uma das classes tivesse o seu próprio método Mudar.
Para evitar a criação desses métodos e/ou classes desnecessárias, nós podemos parametrizar a execução método Mudar, utilizando a variável nomeCena que poderá ter o seu valor alterado através do editor da Unity, dependendo da cena onde o script será utilizado. Ficou claro?
Vamos continuar a configuração das nossas cenas que isso vai te ajudar a entender melhor. Vamos lá?
Na Unity, com a cena Menu aberta, vamos adicionar o script FluxoCena no botão BotaoFase1, localizado em Canvas/Menu/Painel/BotaoFase1, na Hierarquia do projeto.
|
Adicionando script FluxoCena ao botão BotaoFase1 |
Após arrastar o
script para o BotaoFase1, podemos confirmar através no
Inspector que o
script FluxoCena foi adicionado, bastando selecionar o
BotaoFase1 na
Hierarquia.
|
Script FluxoCena após ser adicionado ao BotaoFase1 |
O próximo passo é configurar o
script/componente
Button para adicionar uma ação de clique, associada ao
script FluxoCena. Essa associação é necessária para que o botão saiba em qual
script está o método que será executado quando o botão for pressionado pelo jogador.
|
Adicionando a ação de clique ao botão BotaoFase1
|
Agora que o
script FluxoCena está associado a ação de clique, precisamos especificar qual método, do
script FluxoCena, será executado no momento do clique.
|
Selecionando o método executado ao clicar no botão BotaoFase1 |
Antes de testarmos a transição do Menu para a Fase 1, precisamos apenas preencher o nome da cena para qual o jogador será levado, quando o botão BotaoFase1 for pressionado. Neste caso, o jogador deverá ser levado para a cena Fase1.
|
Definição do nome da cena para onde o jogador será direcionado |
Agora finalmente podemos testar a transição entre cenas. Basta pressionar o
play para iniciar o jogo e clicar no botão.
|
Transição do Menu para a Fase 1
|
...e funciona! \o/
Conseguimos fazer a transição do Menu para a Fase 1. De forma similar, precisamos apenas configurar a ação de clique na Fase 1, para podermos navegar de volta para o Menu. Para isso, precisamos abrir a cena Fase 1 na Unity. Vamos tentar?
Com a cena Fase 1 aberta, precisamos realizar os seguintes passos:
- Adicionar o script FluxoCena no botão BotaoMenu;
- Adiciona uma ação de clique no BotaoMenu;
- Associar o script FluxoCena a ação de clique do BotaoMenu;
- Selecionar o método Mudar para ser executado no momento do clique;
- Preencher o nome da cena (Menu) para onde o jogador será adicionado ao clicar no botão.
Os passos 1, 2 e 3 podem ser realizados conforme ilustrado abaixo:
|
Configuração do botão BotaoMenu
|
Em seguida, basta selecionar o método
Mudar, disponível no
script FluxoCena.
|
Seleção do método Mudar para ser executado no momento do clique
|
E como último passo da configuração, basta preencher o nome da cena para onde o jogador deverá ser direcionado (Menu) ao clicar no botão
BotaoMenu.
|
Definição do nome da cena para onde o jogador será direcionado |
Tudo pronto! É hora de comemorar...certo?
Vamos executar o nosso jogo a partir da cena Fase 1 para testarmos essas últimas configurações...
|
Teste de clique na Fase 1
|
Como assim?! Eu tenho certeza que fiz tudo certinho, mas eu clico no botão e
nada acontece! Por quê?
Na verdade, quando você clica no botão algo está acontecendo, mas nesse caso é algo errado. Quer ver?
Se olharmos com calma para a Unity, vamos perceber que sempre que clicamos no botão BotaoMenu uma nova mensagem de erro aparece no Console da Unity.
|
Mensagem de erro no Console. Menu não pode ser carregado
|
Eita! É verdade. Mas por que isso acontece?
Bem, a mensagem de erro diz o seguinte:
A cena "Menu" não pôde ser carregada porque ela não foi adicionada nas configurações de compilação (build settings). Para adicionar a cena nas configurações de build user o menu File -> Build Settings.
De uma forma bem simples: nós precisamos dizer para a Unity que a nossa cena Menu faz parte do jogo.
E por que isso não aconteceu com a cena Fase 1?
É simples. A cena Fase 1 foi criada automaticamente pela Unity quando criamos o nosso projeto. Sendo assim, a Unity também adicionou essa cena nas configurações de compilação. No caso da cena Menu e todas as outras cenas que forem adicionadas posteriormente, precisarão ser manualmente adicionadas nas configurações de compilação. Mas pode ficar tranquilo, que isso é bem fácil de fazer.
Seguindo as instruções da Unity, basta acessar o menu File e selecionar a opção Build Settings. Em seguida, a janela de configurações de compilação (build settings) será exibida, contendo a lista de cenas já configuradas para a compilação (scenes in build). Com a janela de build settings aberta, basta arrastar e soltar a cena Menu na lista de cenas da compilação, conforme pode ser visto a seguir:
|
Adicionando cena nas configurações de compilação
|
Agora, que tal testarmos o nosso jogo novamente?
|
Transição entre cenas
|
Pronto! Agora sim, nós temos a nossa transição entre cenas funcionando, permitindo que o jogador navegue entre as cenas
Menu e
Fase 1. Para adicionar mais cenas, basta seguir os passos listados neste post, lembrando sempre de configurar o
script FluxoCena com o nome da cena para onde o jogador deve ser direcionado. Embora o exemplo sirva para navegar entre cenas ao pressionas um botão na interface, o mesmo
script FluxoCena e o método
Mudar podem ser utilizados em outras situações, como, por exemplo, chegar em um ponto específico de uma fase, ou coletar um item no jogo.
O projeto desenvolvido neste post pode ser baixado
aqui.
E aí, o que achou?
Comenta aí com sugestões e
feedbacks. Até mais! o/
Comentários
Postar um comentário