Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Crear Menú Principal | Mejorar el Juego
Juego de Lucha en Unity

bookCrear 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?

question mark

¿Qué sucede cuando se llama al método FinishGame en la clase GameManager?

Select the correct answer

question mark

¿Qué sucede cuando el GameManager cambia el estado del juego a GameStates.Finished?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 4. Capítulo 3

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

bookCrear 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?

question mark

¿Qué sucede cuando se llama al método FinishGame en la clase GameManager?

Select the correct answer

question mark

¿Qué sucede cuando el GameManager cambia el estado del juego a GameStates.Finished?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 4. Capítulo 3
some-alt