Crear Menú Principal
Menú Principal
Script para el Menú Principal
using UnityEngine;
using UnityEngine.SceneManagement;
public class MainUI : MonoBehaviour
{
public void StatTheGame()
{
SceneManager.LoadScene(1);
}
public void Quit()
{
Application.Quit();
}
}
La clase MainUI
es un script sencillo que proporciona funcionalidad para iniciar el juego y salir de la aplicación. Este script está diseñado para ser utilizado con botones de la interfaz de usuario en Unity.
Definición de la Clase y Métodos
El método StatTheGame
está diseñado para iniciar el juego cargando una nueva escena. Específicamente, SceneManager.LoadScene(1)
indica a Unity que cargue la escena con el índice de compilación 1
, que corresponde a su posición en la Configuración de Compilación.
El método Quit
permite cerrar la aplicación llamando a Application.Quit()
, aunque esta funcionalidad solo es efectiva en una aplicación compilada y no dentro del Editor de Unity.
Uso en Unity
Adjuntar el Script
Crear un GameObject (por ejemplo, un GameObject vacío o un elemento de UI).
Adjuntar el script MainUI
al GameObject arrastrando el script sobre él o utilizando el botón Add Component
en el Inspector.
Configuración de los Botones de UI
Crear un botón de UI (por ejemplo, GameObject > UI > Button
).
Seleccionar el botón y dirigirse al Inspector.
En la sección On Click ()
, hacer clic en el botón +
para agregar un nuevo evento.
Arrastrar el GameObject con el script MainUI
adjunto al campo de objeto.
En el menú desplegable, seleccionar MainUI > functionName
.
Game Manager
Script para Game Manager
public class GameManager : MonoBehaviour
{
public GameStates GameState { private set; get; }
public static event System.Action<GameStates> onGameStateChanges;
public static GameManager instance;
void Awake()
{
if (instance != null)
{
Destroy(gameObject);
return;
}
instance = this;
DontDestroyOnLoad(gameObject);
}
void Start()
{
GameState = GameStates.Playing;
onGameStateChanges?.Invoke(GameState);
}
public void FinishGame()
{
GameState = GameStates.Finished;
onGameStateChanges?.Invoke(GameState);
}
}
public enum GameStates
{
Playing,
Finished,
}
La clase GameManager
es responsable de gestionar el estado del juego. Utiliza el patrón singleton para asegurar que solo exista una instancia de GameManager
en el juego, administra el estado del juego y transmite los cambios de estado mediante eventos.
Definición de la clase y variables miembro
Métodos
Método Awake
void Awake()
{
if (instance != null)
{
Destroy(gameObject);
return;
}
instance = this;
DontDestroyOnLoad(gameObject);
}
Propósito: Garantiza que solo exista una instancia de GameManager
y evita que se destruya al cargar nuevas escenas.
Patrón Singleton: Verifica si ya existe una instancia. Si es así, destruye el duplicado. De lo contrario, asigna la instancia y marca el objeto para que no se destruya al cargar una nueva escena.
Método Start
void Start()
{
GameState = GameStates.Playing;
onGameStateChanges?.Invoke(GameState);
}
Propósito: Inicializa el estado del juego en Playing
al comenzar el juego y activa el evento onGameStateChanges
.
Método FinishGame
public void FinishGame()
{
GameState = GameStates.Finished;
onGameStateChanges?.Invoke(GameState);
}
Propósito: Establece el estado del juego en Finished
y activa el evento onGameStateChanges
.
Enum GameStates
public enum GameStates
{
Playing,
Finished,
}
Propósito: Define los posibles estados del juego.
Enemigo reacciona a los cambios de estado del juego
private void GameManager_onGameStateChanges(GameStates state)
{
if (state == GameStates.Finished)
{
stateManager.ChangeState(idle);
}
}
Este método gestiona los cambios de estado del juego. Cuando el estado del juego cambia a Finished
, el estado del enemigo se cambia a idle
.
Panel de Finalización
Script para el Panel de Finalización
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.SceneManagement;
public class FinishPanel : MonoBehaviour
{
[SerializeField] Player player;
[SerializeField] GameObject panel;
[SerializeField] TMP_Text infoText;
private void Start()
{
GameManager.onGameStateChanges += GameManager_onGameStateChanges;
}
private void GameManager_onGameStateChanges(GameStates obj)
{
if (obj == GameStates.Finished)
{
panel.SetActive(true);
OnGameFinished();
}
}
void OnGameFinished()
{
if (player.isDead)
{
infoText.text = "You lost";
infoText.color = Color.red;
}
else
{
infoText.text = "You Won";
infoText.color = Color.green;
}
}
public void BackToMainMenu()
{
SceneManager.LoadScene(0);
}
public void Quit()
{
Application.Quit();
}
}
La clase FinishPanel
gestiona la visualización y funcionalidad del panel de finalización que aparece cuando termina la partida. Este panel proporciona retroalimentación al jugador sobre si ha ganado o perdido y ofrece opciones para volver al menú principal o salir del juego.
Explicación
Métodos
Método Start
private void Start()
{
GameManager.onGameStateChanges += GameManager_onGameStateChanges;
}
Propósito: Suscribirse al evento GameManager.onGameStateChanges
para escuchar los cambios en el estado del juego.
Método GameManager_onGameStateChanges
private void GameManager_onGameStateChanges(GameStates obj)
{
if (obj == GameStates.Finished)
{
panel.SetActive(true);
OnGameFinished();
}
}
Propósito: Gestiona los cambios de estado del juego. Cuando el estado del juego es Finished
, activa el panel de finalización y llama a OnGameFinished
.
Método OnGameFinished
void OnGameFinished()
{
if (player.isDead)
{
infoText.text = "You lost";
infoText.color = Color.red;
}
else
{
infoText.text = "You Won";
infoText.color = Color.green;
}
}
Propósito: Actualiza el texto del panel de finalización según si el jugador está muerto o vivo.
Lógica: Si el jugador está muerto, el método establece el texto en "You lost" en rojo. Si el jugador está vivo, lo establece en "You Won" en verde.
Método BackToMainMenu
public void BackToMainMenu()
{
SceneManager.LoadScene(0);
}
Propósito: Carga la escena del menú principal (índice de compilación 0) cuando se llama. Este método está destinado a ser vinculado a un botón en la interfaz de usuario.
Método Quit
public void Quit()
{
Application.Quit();
}
Propósito: Cierra la aplicación cuando se llama. Este método está destinado a ser vinculado a un botón en la interfaz de usuario.
Resumen
La clase FinishPanel
muestra los resultados al finalizar el juego y ofrece opciones para volver al menú principal o salir. Se suscribe a GameManager.onGameStateChanges
para actualizarse adecuadamente cuando el juego termina, mejorando la experiencia del usuario con retroalimentación clara y opciones intuitivas.
1. ¿Qué sucede cuando se llama al método FinishGame
en la clase GameManager
?
2. ¿Qué sucede cuando el GameManager
cambia el estado del juego a GameStates.Finished
?
¡Gracias por tus comentarios!