[POO] Herança na Unity

Herança é um conceito do paradigma de programação conhecido como Programação Orientada a Objetos , que tem como objetivo construir e trabalhar com abstrações de objetos do mundo real, em um nível de código. A Herança dá a capacidade de uma classe/objeto herdar comportamentos previamente definidos em outra classe, sem a necessidade de duplicação do código, permitindo a extensão e a sobrescrita de comportamentos já existentes, de acordo com a necessidade do novo objeto/classe. Para definir uma relação de herança no C#, a "palavra" reservada : (dois pontos) deve ser utilizada na definição da classe que estamos criando, indicando de qual outra classe o nosso script deve herdar. public class Jogador : MonoBehaviour { // Classe Jogador que herda da classe MonoBehaviour } Por padrão, todos os scripts criados na Unity herdam de MonoBehaviour, que é a classe base da Unity para Scripts que serão associados aos GameObjects do jogo. Embora essa definição de herança

Transição de Fases (navegação entre Cenas) na Unity

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
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
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
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
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
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
Salvar cena Menu


Vamos alterar também o visual da cena Menu para instruir o jogador sobre o seu funcionamento.

Interface do Menu
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:
  1. O jogador clica no botão do Menu;
  2. O botão executa o método Mudar do script FluxoCena;
  3. O método Mudar executa o LoadScene;
  4. 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:
  1. Criar um novo método para cada nova transição de cena (MudarFase1, MudarMenu e etc.);
  2. 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
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
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
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
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
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
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:
  1. Adicionar o script FluxoCena no botão BotaoMenu;
  2. Adiciona uma ação de clique no BotaoMenu;
  3. Associar o script FluxoCena a ação de clique do BotaoMenu;
  4. Selecionar o método Mudar para ser executado no momento do clique;
  5. 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
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
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
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
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
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
Adicionando cena nas configurações de compilação

Agora, que tal testarmos o nosso jogo novamente?

Transição entre cenas
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

Postagens mais visitadas deste blog

GetComponent - Obtendo a referência para outros componentes do GameObject

[POO] Herança na Unity