Carlos Daniel
wow la mejor explicacion de como funcionan y que son los enumeradores. que increible maestro
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.
¿Cómo se crea y por qué aparece el engranaje?
¿Qué métodos públicos conviene definir?
¿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.
using UnityEngine; public enum GameState { Menu, InGame, GameOver } public class GameManager : MonoBehaviour { public GameState currentGameState = GameState.Menu; // Inicia la partida. public void StartGame() { SetGameState(GameState.InGame); } // Termina la partida. public void GameOver() { SetGameState(GameState.GameOver); } // Vuelve al menú principal. public void BackToMenu() { SetGameState(GameState.Menu); } // Cambia el estado y prepara la escena. private void SetGameState(GameState newGameState) { if (newGameState == GameState.Menu) { // TODO: lógica del menú (mostrar botones, pausar, etc.). } else if (newGameState == GameState.InGame) { // TODO: preparar la escena para jugar (activar personaje, etc.). } else if (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?
¿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.
¿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.
Carlos Daniel
wow la mejor explicacion de como funcionan y que son los enumeradores. que increible maestro
Jesus Ramos
Para los que no pudieron hacer las dos barras verticales con su teclado ||
Angel Sebasthyan Chavez Aiquipa
También se puede hacer con la tecla a la izquierda del 1 de los números en la parte superior.
Ihared Sefiroth Hernández Arias
En Windows 10 se puede acceder a una ventana para escribir símbolos con: tecla Windows + .
Kenny Russell Vasquez Justiniano
Alguien se dio cuenta que el profesor en vez de "GameState" puso "GameSate"? xD
Martin Chavez Ceja
vivan los enum!
Andres Alba
Es absolutamente necesario poner this en la instrucción this.currentGameState?
Alvaro Robles
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
public class Ejemplo { private int variable = 0; public void feliz (int variable) { this.variable = variable; } }
En este ejemplo se asigna la externa variable a la instancia de la supuesta clase.
Saludos
Juan Sebastian Avila
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.
Ruben Dario Acosta Valle
Excelente clase
Wilson Wilson
Duvan Mauricio Rodriguez Penagos
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?
Alexis Duque
Puede mi GameManager ser un Prefab, así tener diferentes managers en el juego para diferentes mecánicas?
Javier Estrada
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?
Ricardo Rito Anguiano
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?
Luis D. Juárez Duque
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
Altair Barahona
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
Luis D. Juárez Duque
Una pregunta, ¿En que casos se utiliza doble = (==) y en qué casos únicamente se utiliza 1 =?
Hector Esau M
Altair Barahona
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
Sebastian Duran
Los enum (enumeracion) son tipos de valores definidos por un conjunto de constantes subyugadas a valores tipo entero
Juan Carlos Padilla Climaco
hola
ian f
hola
Abel rolon
increible
Bobionwa .
esta es una opcion para documentar con /* al inicio y */ al finaliizar
Pablo Andrés Cotí Arredondo
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
Martin Mendez
tal vez en nombre de tu archivo sea diferente al de tu clase
public class **PlayerController **: MonoBehaviour{ }
Ricardo Rito Anguiano
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
Germán Arevalo Jerez
No me muestra el icono en el modo Game, alguno sabe por que?
steven leal
Tiene que activar el Gizmos
Germán Arevalo Jerez
Lo tenía activado en su momento, pero ya después si me lo empezó a mostrar. No se que pasó.
David Martínez Jiménez
Que buen profesor! explica excelente!
void Update() { bool touchingGround = IsTouchingTheGround(); // 0. Si toca el piso y no va subiendo, recuperamos los saltos if (touchingGround && rb.linearVelocity.y <= 0.1f) { consecutiveJumps = 0; } // 1. PASAR DATOS AL ANIMATOR if (animator != null) { animator.SetBool(STATE_ON_THE_GROUND, touchingGround); if (horizontalInput == 0f && touchingGround) { // Si está en el suelo y no presionas nada, apagamos el animator para congelarlo quieto animator.enabled = false; } else { // En cuanto te mueves o saltas, se vuelve a encender automáticamente animator.enabled = true; animator.SetFloat("horizontalVelocity", Mathf.Abs(rb.linearVelocity.x)); } } // 2. NUEVO: Leer las teclas A y D usando el Nuevo Input System horizontalInput = 0f; if (Keyboard.current != null) { if (Keyboard.current.dKey.isPressed) horizontalInput = 1f; // Derecha if (Keyboard.current.aKey.isPressed) horizontalInput = -1f; // Izquierda } // 3. NUEVO: Controlar el giro visual del personaje (Flip) if (horizontalInput > 0 && !facingRight) { Flip(); } else if (horizontalInput < 0 && facingRight) { Flip(); } // 4. Leer controles de salto bool espacioPresionado = Keyboard.current != null && Keyboard.current.spaceKey.wasPressedThisFrame; bool clicPresionado = Pointer.current != null && Pointer.current.press.wasPressedThisFrame; if (espacioPresionado || clicPresionado) { if (consecutiveJumps < maxJumps) { Jump(); } } }