Com o novo projeto aberto, renomeie a scene, Sample Scene para Game.
Adicione uma nova cena (Scene) e nomeie como Menu.
Mude a resolução do jogo para Full HD (1920 X 1080). Na aba GAME da Unity.
Abra a cena Menu (duplo clique na cena Menu).
Na Hierarquia da cena Menu, adicione o item Canvas. Botão direito na hierarquia🡪 UI 🡪 Canvas.
Configurando o Canvas:
Selecione o GameObject Canvas.
- Modifique as configurações do Canvas no Inspector:
- Render Mode: Screen Space- Camera
- Render Camera : Main Camera (Camera do jogo).
- Marque a opção Vertex.
Adicione os seguintes objetos dentro do Canvas (Botão direito 🡪 UI):
- UI🡪 IMAGE
- UI🡪 Panel
Adicione os seguintes objetos dentro do Panel (Botão direito encima do Panel 🡪UI):
- UI🡪Image
- UI🡪Button
- UI🡪Button
- UI🡪Button
Ficará parecido com a imagem abaixo :
Dando nome as coisas!
- Image (do Canvas) 🡪 Fundo
- Panel 🡪 SelecionarPersonagem
- Image (do Panel) 🡪 Personagem
- Button 🡪 Proximo
- Button 🡪 Anterior
- Button 🡪 Selecionar
Organizando o Layout e adicionando os Sprites.
- Adicione os Sprites ao seu projeto na Unity:
- Localize a pasta dos sprites na pasta pública.
- Arraste a pasta para dentro da pasta ASSETS de seu projeto.
Configurando os objetos do Canvas
Selecione o Objeto Fundo
No componente Image, altere a propriedade Source Image.
- O sprite que iremos usar está na pasta Assets/Sprites/UI/BG
Altere o tamanho da image:
- Width= 1920 e Height=1080
OK, Selecione o Objeto Panel SelecionarPersonagem
Selecione o Objeto SelecionarPersonagem
No componente Image, altere a propriedade Color.
Altere a transparência, deixe transparente.
Observe a imagem.
Configurando os Botões e Image do SelecionarPersonagem
- Personagem:
- Width=300 e Height=300
- Botão Proximo:
- Pos X = 420 Pos Y=0 Pos Z = 0
- Width = 200 Height=200
- Source Image = 47.png
- Botão Anterior:
- Pos X = -420 Pos Y=0 Pos Z = 0
- Width = 200 Height=200
- Source Image = 47.png
- Botão Selecionar:
- Pos X = 0 Pos Y= -300 Pos Z = 0
- Width = 200 Height=200
- Source Image = 38.png
GameManager
Este objeto irá gerenciar grande parte do nosso jogo.
- Crie um GameObject em branco (Empty)
- Nomeie como GameManager
Crie uma pasta chamada Scripts dentro de Assets.
- Dentro da pasta Script crie uma pasta chamada Menu. A pasta Menu irá armazenar os scripts específicos da cena Menu.
- Crie um script c# dentro da pasta Scripts chamado DadosUsuario.cs
O script DadosUsuario.cs
Onde:
Resumo do Funcionamento:
- Singleton Pattern: A classe DadosUsuario é implementada como um Singleton, garantindo que apenas uma instância dela exista durante a execução do jogo. Isso é útil para gerenciar dados globais, como o nome do personagem, que precisam persistir entre cenas.
- Persistência de Dados: O método DontDestroyOnLoad(gameObject) garante que o GameObject ao qual este script está anexado não seja destruído ao carregar uma nova cena, mantendo os dados armazenados na classe.
- Controle de Acesso: A propriedade nomePersonagem tem um get público e um set privado, o que significa que outras classes podem ler o valor, mas só podem modificá-lo através do método setNomePersonagem.
Atenção!!!!!
Anexe o Script DadosUsuario.cs no Objeto GameManager
Agora vamos criar O script para selecionar o Personagem.
Dentro da pasta Menu (Assets🡪 Menu), crie um script de nome SelecionarPersonagem.cs
Abra o script:
Onde:
- using UnityEngine;: Importa as funcionalidades básicas do Unity.
- using UnityEngine.UI;: Importa as funcionalidades relacionadas à interface do usuário (UI), como Image, Button, etc.
- using UnityEngine.SceneManagement;: Importa as funcionalidades para gerenciar cenas, como carregar uma nova cena.
- public string[] nomePersonagem;
- Um array de strings que armazena os nomes dos personagens disponíveis para seleção.
- Cada índice deste array corresponde ao nome de um personagem.
- public Image imagemPersonagem;
- Um componente de UI do tipo Image que exibe a imagem do personagem selecionado.
- Este componente deve ser configurado no Inspector do Unity, arrastando um objeto de UI (como um Image) para este campo.
- public Sprite[] spritesPersonagens;
- Um array de Sprite que armazena as imagens dos personagens.
- Cada índice deste array corresponde à imagem de um personagem.
- int indice = 0;
- Uma variável inteira que controla o índice atual das listas nomePersonagem e spritesPersonagens.
- Inicializada com 0, o que significa que o primeiro personagem da lista será exibido por padrão.
Método atualizarImage
- Este método atualiza a imagem exibida na UI (imagemPersonagem) com o sprite correspondente ao índice atual (indice).
- É chamado sempre que o jogador avança ou retrocede na seleção de personagens.
Método proximoPersonagem
- indice++;
- Incrementa o valor de indice para avançar para o próximo personagem.
- if (indice >= spritesPersonagens.Length):
- Verifica se o índice ultrapassou o tamanho do array spritesPersonagens.
- Se sim, significa que o jogador chegou ao final da lista e deve voltar ao primeiro personagem.
- indice = 0;
- Reinicia o índice para 0, voltando ao primeiro personagem.
- atualizarImage();
- Atualiza a imagem exibida na UI para refletir o novo personagem selecionado.
Método anteriorPersonagem
- indice–;:
- Decrementa o valor de indice para retroceder ao personagem anterior.
- if (indice < 0):
- Verifica se o índice é menor que 0.
- Se sim, significa que o jogador está no primeiro personagem e deve ir para o último.
- indice = spritesPersonagens.Length – 1;
- Define o índice para o último personagem da lista.
- atualizarImage();:
- Atualiza a imagem exibida na UI para refletir o novo personagem selecionado.
Método confirmarPersonagem
- DadosUsuario.Instance.setNomePersonagem(nomePersonagem[indice]);:
- Usa a instância da classe DadosUsuario (que deve ser um Singleton) para armazenar o nome do personagem selecionado.
- O nome é obtido do array nomePersonagem usando o índice atual (indice).
- SceneManager.LoadScene(“Game”);
- Carrega uma nova cena chamada “Game”.
- Isso permite que o jogo prossiga para a próxima fase ou tela após a seleção do personagem.
Método Start
- indice = 0;:
- Define o índice inicial como 0, garantindo que o primeiro personagem seja exibido ao iniciar o jogo.
- atualizarImage();:
- Atualiza a imagem na UI para exibir o sprite do primeiro personagem.
Resumo do Funcionamento
- Inicialização:
- Quando o jogo começa, o método Start é chamado, configurando o índice para 0 e exibindo a imagem do primeiro personagem.
- Navegação entre Personagens:
- O jogador pode avançar ou retroceder na lista de personagens usando os métodos proximoPersonagem e anteriorPersonagem.
- A imagem na UI é atualizada automaticamente para refletir a seleção atual.
- Confirmação da Seleção:
- Quando o jogador confirma a seleção, o nome do personagem é armazenado na classe DadosUsuario (usando o padrão Singleton).
- Em seguida, o jogo carrega uma nova cena chamada “Game”.
Como Usar no Unity
Anexe o Script, SelecionarPersonagem, no objeto Canvas na hierarchy.
Selecione o Canvas
- Configuração no Inspector:
- Atribua os sprites dos personagens ao array spritesPersonagens.
- Atribua os nomes dos personagens ao array nomePersonagem.
- Arraste um objeto Personagem de UI (Image) para o campo imagemPersonagem.
- Botões de Navegação:
- Nos Botões UI para “Próximo” e “Anterior” e vincule-os aos métodos proximoPersonagem e anteriorPersonagem.
- Botão de Confirmação:
- No Botão “Selecionar” e vincule-o ao método confirmarPersonagem.
Organizando as Cenas
- Clique em File 🡪 Build Settings
- Abra a pasta Scenes
- Arraste as cenas para dentro de Scenes Build
- Ordene, utilizando o mouse, para que a primeira cena seja o Menu.
Salve o Projeto.
Cena Game
Adicione os Sprites dos personagens na cena, e renomeie de acordo com o nome correto dos personagens, da mesma forma que você nomeou na cena do Menu.
Crie uma Pasta chamada “Prefabs”, dentro de Assets.
Arraste os Players (Guerreiro e Bruxo) para dentro da pasta Prefabs.
Os objetos irão mudar de cor, significando que são prefabs.
Delete os Players da Hierarchy, mantendo os objetos no Prefabs.
Crie um GameObject Empty e renomei como GameScene.
Crie uma Pasta chamada Game dentro da Pasta Scripts. Crie um script chamado GameScene.cs e anexe ao objeto GameScene.
O Script GameScene
Este script irá cuidar as ações globais dentro da cena game.
Vamos editar o Script:
Onde
1. Array de Prefabs (characterPrefabs):
- public GameObject[] characterPrefabs;:
- Este array armazena os prefabs dos personagens que podem ser instanciados na cena.
- Cada prefab é um GameObject que representa um personagem jogável.
- No Inspector do Unity, você pode atribuir os prefabs dos personagens a este array.
2. Método Start:
- O método Start é chamado automaticamente pelo Unity quando a cena é carregada.
- Ele é usado para inicializar lógica ou configurar objetos no início da cena.
3. Obtenção do Personagem Selecionado:
- string selectedCharacter = DadosUsuario.Instance.nomePersonagem;:
- Aqui, o script acessa a instância da classe DadosUsuario (que deve ser um Singleton) para obter o nome do personagem selecionado.
- O nome do personagem foi armazenado anteriormente (Ne tela de Menu) e está sendo recuperado aqui.
4. Loop foreach:
- foreach (var prefab in characterPrefabs):
- O foreach é um loop que percorre cada elemento de um array ou lista.
- Neste caso, ele itera sobre o array characterPrefabs, que contém os prefabs dos personagens.
- A cada iteração, a variável prefab recebe o valor do elemento atual do array.
5. Verificação do Nome do Prefab:
- if (prefab.name == selectedCharacter):
- Dentro do loop, o script verifica se o nome do prefab atual (prefab.name) corresponde ao nome do personagem selecionado (selectedCharacter).
- O name é uma propriedade de GameObject que retorna o nome do objeto no Unity.
6. Instanciação do Prefab:
- Instantiate(prefab, transform.position, Quaternion.identity);:
- O método Instantiate é usado para criar uma cópia de um GameObject (neste caso, o prefab do personagem) na cena.
- Parâmetros:
- prefab: O prefab que será instanciado.
- transform.position: A posição onde o prefab será criado. Neste caso, a posição do objeto que contém este script.
- Quaternion.identity: A rotação do objeto. Quaternion.identity significa “sem rotação” (rotação padrão).
7. Uso do break:
- break;:
- O break é usado para sair do loop foreach assim que o personagem correto for encontrado e instanciado.
- Isso evita percorrer o restante do array desnecessariamente.
Funcionamento Geral do Script
- Inicialização:
- Quando a cena é carregada, o método Start é executado.
- Recuperação do Personagem Selecionado:
- O script obtém o nome do personagem selecionado a partir da classe DadosUsuario.
- Busca e Instanciação do Prefab:
- O script percorre o array characterPrefabs usando um loop foreach.
- Para cada prefab, ele verifica se o nome corresponde ao personagem selecionado.
- Quando o prefab correto é encontrado, ele é instanciado na cena usando o método Instantiate.
- Finalização:
- O loop é interrompido com break após a instanciação do personagem.
Resumo
- foreach: Usado para percorrer todos os elementos de um array ou lista.
- Instantiate: Usado para criar uma cópia de um GameObject (prefab) na cena.
- Funcionalidade do Script: Instancia o personagem selecionado pelo jogador na cena de jogo, com base no nome armazenado em DadosUsuario.
Uso no Unity
- Configuração no Inspector:
- No Unity,Selecione o objeto GameScene, arraste os prefabs dos personagens para o array characterPrefabs no Inspector.
- Certifique-se de que os nomes dos prefabs correspondam aos nomes armazenados em DadosUsuario.
- Cena de Seleção de Personagem:
- Em uma cena anterior (por exemplo, uma tela de seleção de personagens), o jogador escolhe um personagem, e o nome é armazenado em DadosUsuario.
- Cena de Jogo:
- Quando a cena de jogo é carregada, este script instancia o personagem selecionado na posição do objeto que contém o script.
Volte para a cena do Menu para realizar o teste.