Controlar el flujo de un videojuego en Unity exige un Game Manager claro y extensible: define estados con un enum, expone métodos públicos para iniciar, terminar o volver al menú, y centraliza cambios con un único método que actualiza el estado y prepara la escena.
¿Qué es un game manager en Unity y por qué importa?
Un Game Manager es el director que coordina los parámetros globales: pausa, menú principal, partida en marcha y reglas por estado. Unity marca el script con un icono de rueda porque es el engranaje central, fácil de localizar cuando el proyecto crece.
Coordina estados: menú, en partida y game over.
Centraliza reglas y evita duplicar lógica.
Facilita mantenimiento con el enfoque de divide y vencerás.
¿Cómo se crea y por qué aparece el engranaje?
Crea un nuevo script C# llamado “GameManager”.
Unity lo resalta con un engranaje para ubicarlo rápido entre muchos scripts.
Se abre en Visual Studio y hereda de MonoBehaviour como cualquier otro.
¿Qué métodos públicos conviene definir?
public void StartGame: inicia la partida.
public void GameOver: finaliza cuando el jugador muere.
public void BackToMenu: vuelve al menú principal.
Recuerda visibilidad: si no indicas nada, es privado; si pones public, es público.
Comenta con “//” para documentar tu intención y facilitar futuras revisiones.
¿Cómo estructurar estados del juego con un enum en C#?
Para guardar el estado global usa un enum accesible desde otros scripts. Decláralo fuera de la clase para poder referenciarlo desde, por ejemplo, un Player Controller.
enum con tres valores: Menu, InGame, GameOver.
Variable pública para el estado actual: comienza en Menu para que el jugador decida cuándo empezar.
Un método privado SetGameState centraliza cambios de estado y actualizaciones de escena.
usingUnityEngine;publicenumGameState{ Menu, InGame, GameOver
}publicclassGameManager:MonoBehaviour{publicGameState currentGameState = GameState.Menu;// Inicia la partida.publicvoidStartGame(){SetGameState(GameState.InGame);}// Termina la partida.publicvoidGameOver(){SetGameState(GameState.GameOver);}// Vuelve al menú principal.publicvoidBackToMenu(){SetGameState(GameState.Menu);}// Cambia el estado y prepara la escena.privatevoidSetGameState(GameState newGameState){if(newGameState == GameState.Menu){// TODO: lógica del menú (mostrar botones, pausar, etc.).}elseif(newGameState == GameState.InGame){// TODO: preparar la escena para jugar (activar personaje, etc.).}elseif(newGameState == GameState.GameOver){// TODO: preparar el juego para el Game Over.}this.currentGameState = newGameState;}}
Piensa este flujo como un semáforo: menú en rojo (se detiene todo), in game en verde (todo activo) y game over en amarillo (transición hacia el menú).
¿Por qué sirve el enfoque divide y vencerás?
Separa una tarea grande en subtareas manejables.
Reduce errores y acelera depuración.
Facilita añadir nuevos estados con cambios mínimos.
¿Cómo implementarlo y probarlo en la escena de Unity?
Nada funciona hasta asignar el script a un GameObject en la escena. La forma habitual es usar un objeto vacío para no acoplar el manager a cámara o personaje.
Crea un GameObject vacío: GameObject > create empty.
Asigna el script “GameManager” arrastrándolo al Inspector.
Opcional: añade un gizmo visual para no perderlo en la escena.
Gracias al enum, verás un desplegable en el Inspector para cambiar el estado.
Al dar Play, prueba transiciones cambiando entre Menu, InGame y GameOver con un clic.
¿Con ganas de seguir? Comparte cómo organizarías la lógica de menú, in game y game over dentro de SetGameState y qué otras transiciones añadirías.
Como dato curioso, el "divide y vencerás" data de el imperio Chino, y esta descrito en el libro de Sun Tzu en El Arte de la Guerra, muy buen libro.
Y otra recomendación para aplicar la frase de divide y vencerás en tecnología es aprender POO. C# es un muy bien lenguaje para aplicar POO y en Platzi hay un curso con la Profa Anahí, buenísimo. 100% Recomendado: https://platzi.com/clases/oop/
Lo basico de Estructura de datos division de metodos para hacer el programa mas legible.
wow la mejor explicacion de como funcionan y que son los enumeradores. que increible maestro
Para los que no pudieron hacer las dos barras verticales con su teclado
||
También se puede hacer con la tecla a la izquierda del 1 de los números en la parte superior.
En Windows 10 se puede acceder a una ventana para escribir símbolos con: tecla Windows + .
Alguien se dio cuenta que el profesor en vez de "GameState" puso "GameSate"? xD
vivan los enum!
Es absolutamente necesario poner this en la instrucción this.currentGameState?
this se refiere a la instancia actual de una clase, así que no es necesario, sin embargo es util por ejemplo cuando una variable de entrada en una function se llama igual a una variable interna lo cual deja claro cual es cual
publicclassEjemplo{private int variable =0;publicvoidfeliz(int variable){this.variable= variable;}}
En este ejemplo se asigna la externa variable a la instancia de la supuesta clase.
Saludos
Hola Andres. Por convención se usa la palabra this. Asi estas seguro de que estas haciendo referencia a la variable currentGameState del objeto instanciado.
Asi ayudaras a otros desarrolladores que lean tu código a entender con facilidad a que variable estas haciendo referencia. Recuerda que otros desarrolladores podrían ser tu yo del futuro.
Excelente clase
Hola a todos, cuando creo el gameObect vacío no me deja verlo ni seleccionarlo, solo se ve una esfera gris, alguien sabe como hacer que se vea?
Puede mi GameManager ser un Prefab, así tener diferentes managers en el juego para diferentes mecánicas?
Si en un videojuego hubiera un menú dentro de la escena como para equipar armas, pociones etc, ¿se le asignaría un enum a ese menú para que tenga su propia lógica con los controles?
Generalmente este tipo de cosas, se pueden crear con un enum, ya que son objetos concretos, pero para que tu videojuego sea escalable, por asi decirlo, existe un tipo de script llamado scriptable object el cual te sera muy util para cosas como inventarios,configuraciones, coleccionablese,etc.
¿Qué es un scriptable object?
this.currentGameState = newGameState;
¿para que se utiliza específicamente?, entendí que es para que el juego actualice su estado pero me gustaría estar 100% seguro, y que consecuencias traería, no utilizar dicha linea de código
es importante porque puedes centralizar la lógica del estado de la aplicación. Si borras esa línea afectaría de forma considerable porque eliminas la forma que tiene el juego de conoce en qué estado esté y por ende no podrías por ejemplo mostrar los menús cuando estás en menú principal, hacer que el personaje comience a moverse y el terreno se comience a generar al estar en estado de "inGame" etc, y todo eso se evidencia mejor unas clases más adelante
Una pregunta, ¿En que casos se utiliza doble = (==) y en qué casos únicamente se utiliza 1 =?
= Un igual es un operador de asignación, se usa para cambiar los valores de las variables
dos iguales == es un operador de comparación lo usamos para saber si un valor es igual a otro ejmplo 0 == 0 si es verdadero regresa True si es falso regresa False, se suele usar para ciclos y condiciones y en ves de usar valores ecxplicitos se usan variables
Exacto, si quieres que la velocidad de movimiento valga 5 por ejemplo, colocas velocidadMovimiento=5;
Si quieres comparar cuando la velocidad de movimiento sea 0, es decir el personaje está quieto para por ejemplo poner una animación de descanso, colocas if(velocidadMovimiento==5){
}
si velocidadMovimiento==5 (es igual a 5) es verdad, entonces pasa lo que está dentro del if pero jamás estas asignando que velocidadMovimiento sea 5, estas comparando cuando llegue a valer 5
Los enum (enumeracion) son tipos de valores definidos por un conjunto de constantes subyugadas a valores tipo entero
hola
hola
increible
esta es una opcion para documentar con /* al inicio y */ al finaliizar
Necesito ayuda en Unity al a la hora de agregar un scrip a un objet game me tira un error
"No MonoBehavior scripts in the file, or their names do not match the file name"
nose que hacer ni como arreglarlo
tal vez en nombre de tu archivo sea diferente al de tu clase
public class **PlayerController **: MonoBehaviour{
}
Si aun tienes el error puedes poner captura de tu codigo y te podria ayudar. El error normalmente se da porque la clase no coincide con el nombre del script
No me muestra el icono en el modo Game, alguno sabe por que?
Tiene que activar el Gizmos
Lo tenía activado en su momento, pero ya después si me lo empezó a mostrar. No se que pasó.
Que buen profesor! explica excelente!
Para los que les da problemas a la hora de inicializar el currentGameState, tuve que hacerlo asi:
public GameState currentGameState = global::GameState.menu;