(Texto ainda em desenvolvimento)
Estou criando um jogo mobile e nele haverá várias fases. É sempre bom ter uma tela que mostra as fases disponíveis e as fases trancadas.
Primeiramente, antes de ir para Unity, geralmente desenho a interface no Figma, mas sinta-se à vontade para usar qualquer outra aplicação semelhante. Então, obtive esse resultado inicial:
A partir dessa ideia, vamos criar essa interface em Unity e torná-la interativa.
Primeiro, como no Unity não temos objetos de UI como círculos por padrão, irei criar uma imagem com o editor de imagens GIMP:
Então, para trazer para o Unity, toda essa parte será feita com o objeto Canvas. Os objetos interativos para selecionar fases serão botões TextMeshPro, as barras serão raw images e o texto será um TextMeshPro padrão.
A estrutura ficou da seguinte forma:
E a interface assim:
interface no simulador
A partir dessa interface pronta, é hora de pensar em uma estratégia para quando o usuário apertar o botão da fase escolhida e esse botão passar informações para a cena de jogo. Também por código, mudar o estado de disponibilidade do botão, para só permitir o clique nas fases já desbloqueadas.
Botões
Para fazer os botões funcionarem você pode usar dois objetos
Esses objetos ficam com os scripts de mudança de tela e de definir os elementos do nível, nesse caso uso para colocar a skin do enemy.
SceneHandler:
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneHandler : MonoBehaviour
{
public void LoadScene(string nameScene)
{
// Carrega a cena com o nome especificado
SceneManager.LoadScene(nameScene);
}
public void ResetScene()
{
// Obtém o nome da cena atual
string nameCurrentScene = SceneManager.GetActiveScene().name;
// Recarrega a cena atual pelo seu nome
SceneManager.LoadScene(nameCurrentScene);
}
public void Quit()
{
Application.Quit();
}
}
Aqui eu uso a função LoadScene para carregar a cena de jogo, passando o nome dela por parâmetro.
e SetLevel:
public class SetLevel : MonoBehaviour
{
[SerializeField] private List<Sprite> skinsEnemy;
[SerializeField] private ElementsLevel configLevel;
public void SetConfig(int num)
{
if (skinsEnemy.Count == 0)
{
Debug.LogError("Enemy skins list is empty");
return;
}
if (num < 0 || num >= skinsEnemy.Count)
{
Debug.LogError("Provided number is out of bounds for the enemy skins list");
num = 0;
}
Sprite currentSkinEnemy = skinsEnemy[num];
configLevel.skinPaddleNPC = currentSkinEnemy;
}
}
Aqui eu inicio uma lista de skins e um ScriptableObject que é a estratégia que estou usando para definir a skin do inimigo.
Em cada botão eu coloco o evento de click da seguinte maneira
Escolho a skin que vai ser usada, o número sendo de 0 até o número de skins que tenho até o momento e a cena é a mesma GameOne
Definindo o ScriptableObject
Para definir o scriptableObject faça assim:
[CreateAssetMenu(fileName = "ElementsLevel", menuName = "ElementsLevel", order = 1)]
/**
* <summary>
* Define game params.
* </summary>
*/
public class ElementsLevel : ScriptableObject
{
public Sprite skinPlayer;
public Sprite skinPaddleNPC;
}
Com esse scriptable object eu defino a skin que será usada pelo npc e dentro do nivel eu defino ela no objeto do npc usando um script 'Config Level'.
public class ConfigLevel : MonoBehaviour
{
[SerializeField] private SpriteRenderer paddleNPC;
[SerializeField] private ElementsLevel configLevel;
void Start()
{
paddleNPC.sprite = configLevel.skinPaddleNPC;
}
}
Top comments (0)