CAPÍTULO 1 CONFIGURAR LOS GAME STATES
Un ‘GameManager’ en Unity se considera un script un poco especial, sería como el script que se considera el principal. Como su nombre indica, que controla todo el juego.
Es un objeto que lo sabe todo y todo el mundo sabe de él y tiene que estar puesto en todos los scripts. Es muy útil para el seguimiento del estado del juego. Con esto nos referimos que el juego puede tener muchisimos estados como el estado jugando, el estado cargando, el estado pausado, el estado mostrando díalogos, el estado mostrando cinemáticas. Mantener un seguimiento de estos estados puede ayudar a activar y desactivar objetos o comportamientos en determinados momentos. Por ejemplo ahora mismo tal y como lo tenemos configurado el personaje no debería poder moverse en estado pausado pero lo hace así que vamos a arreglar esto
Vamos a ver como funciona esta nueva forma de controlar los estados de nuestro juego para ello nos iremos dentro de la carpeta Scripts>Utils y veremos si tenemos añadidos el GameStateCharge y el GameStateListener dentro de esta carpeta
Y luego desde la carpeta de Scripts>ScriptableObjects
Debemos tener el GameStateSO y el GameManagerSO
Si abrimos el GameStateSO es basicamente no es nada, es un nombre.
Y en la parte del menú create le estamos diciendo que cuando creemos desde unity un nuevo archivo de este tipo que lo almacene dentro de ScriptableObjects>Game State
Ahora si abrimos el GameManagerSO nos encontraremos con este código
El asset que va a contener el estado actual del juego es un poquito más complejo
Basicamente tiene una variable llamada currentState que es digamos el estado actual
Va a estar avisando a través de un canal de que el estado ha cambiado, el canal será el Broadcasting Events
Tenemos aquí el previousState que lo guardaremos en privado de ahí que sea private. Nos interesa para que cuando el estado cambie. Por ejemplo cuando pasemos del pausa a playing que se muestre ese cambio con respecto a cada estado
Luego tenemos dos métodos publicos uno es el SetGameState. Dónde la primera línea de código nos dice que guarde el previousState si había alguno anteriormente.
Despues comprueba que el estado actual sea el gameState. Y luego si el evento no está nulo, es decir avisa a todo el mundo a través del Raise del nuevo gameState que tenemos ahora mismo
Y por último tenemos otro método publico llamado RestorePreviousState que lo que hace es coger el antiguo state, él que hemos guardado previamente
Ahora vamos a ver el código que hay en el GameStateChanger
Es un Monobehaviour esto quiere decir que lo podemos arrastrar a cualquier objeto
La dependencia es el gameManager. Y desde fuera podemos decirle al SetGameState que añada el estado que nosotros le digamos al script desde la ventana del inspector.
Y por otro lado el método RestorePreviousState lo que hace es llamar al gameState desde un objeto que esté en la escena.
Y el listener es un poquito más complejo pero sirve para ayudarnos a configurar ciertos estados de una manera más rápida. Se ha puesto como listener al GameStateChanged que es el canal de eventos para escuchar el cambio de estado.
Y después lo que hace es ir a la lista de componentes y ver si el nuevo GameState está activado o desactivado.
Y también invocar las acciones que marcaremos en los campos que aparecerán dentro de nuestro objeto desde la ventana Inspector
Ahora nos venimos a la carpeta de ScriptableObjects y creamos una nueva carpeta que llamaremos GameManager
Dentro de esta carpeta pulsaremos al botón derecho del ratón y elegimos la opción de Create>ScriptableObject>GameManager
Vamos a dejarlo tal como se ve:
Crearemos varios estados, para ello repetimos el proceso de crear ScriptableObject pero ahora elegiremos la opción de Game State
Dejaremos estos en total como Game State con los siguientes nombres:
Ahora seleccionaremos el GameManager y lo abriremos desde la ventana del inspector
El GameManager
en Unity es a menudo un componente crucial que gestiona aspectos globales del juego, como la puntuación, el estado del juego, la gestión de niveles, y más:
1. Crear un objeto vacío para el GameManager:
1.1. En el Editor de Unity:
- Crea un objeto vacío llamado «GameManager» en tu escena.
2. Crear el script GameManager:
2.1. Crea un nuevo script llamado «GameManager»:
- Haz clic con el botón derecho en el Assets -> Create -> C# Script.
- Nombre del script:
GameManager
.
2.2. Abre el script en tu editor de código preferido:
- Define variables globales para gestionar el estado del juego, la puntuación, el tiempo, etc.
using UnityEngine; public class GameManager : MonoBehaviour { public static GameManager instance; // Variables de juego public int playerScore = 0; public bool isGameOver = false; private void Awake() { // Implementa el patrón Singleton para asegurar una única instancia del GameManager if (instance == null) { instance = this; } else { Destroy(gameObject); } } void Start() { // Inicializa cualquier configuración inicial del juego // Puedes cargar niveles, establecer valores predeterminados, etc. } void Update(){ // Aquí puedes verificar condiciones para el final del juego, actualizar puntuaciones, etc. if (isGameOver) { // Lógica para el final del juego } } // Otros métodos útilespublic void IncreaseScore(int amount) { // Método para aumentar la puntuación del jugadorplayerScore += amount; // Puedes añadir aquí lógica adicional, como actualizar la interfaz de usuario } public void GameOver() { // Método para llamar al final del juegoisGameOver = true; // Puedes realizar acciones adicionales, como mostrar un menú de fin de juego } }
3. Asignar el script al objeto GameManager:
3.1. Arrastra y suelta el script GameManager al objeto GameManager en tu escena.
4. Utilizar el GameManager desde otros scripts:
4.1. Accede al GameManager desde otros scripts:
- Puedes acceder a la instancia del GameManager desde cualquier otro script usando
GameManager.instance
.
// Ejemplo de cómo aumentar la puntuación desde otro scriptGameManager.instance.IncreaseScore(10);