Contenido del curso
El sistema de UI de Unity
- 4

Canvas y sus modos de renderizado en Unity
08:48 min - 5

El Rect Transform
11:45 min - 6

Componente de imagen
08:05 min - 7

Máscaras y efectos
04:16 min - 8

Texto en Unity con Text Mesh Pro
06:14 min - 9

Creando botones en nuestra interfaz
07:37 min - 10

Otros elementos de UI
05:32 min - 11

Auto layout
09:02 min - 12

Scroll views
05:21 min - 13

Controla grupos de UI con Canvas Group
02:58 min
Haciendo interfaces para el juego
- 14

Pantallas de UI para Safari Match en Unity
02:45 min - 15

Importar y configurar sprites UI en Unity
05:36 min - 16

Construye la Start Screen en Unity
12:31 min - 17

Animando el fondo con shader graph
12:16 min - 18

Agregando lógica a la pantalla de título
11:35 min - 19

Scroll view de selección de niveles en Unity
10:47 min - 20

Genera lista de niveles con prefabs en Unity
Viendo ahora - 21

Corrige bugs de UI antes de añadir más features
08:43 min - 22

Contador de puntos y pausa en Unity HUD
11:06 min - 23

Anima iconos con DOTween en Unity
08:21 min - 24

Pantalla de pausa en Unity con Layout Group
07:42 min - 25

Pantalla de pausa con reseteo de escena en Unity
09:37 min - 26

Rediseño visual de la pantalla Game Over en Unity
07:47 min - 27

Pantalla de opciones con layouts en Unity
11:36 min - 28

Implementación de la pantalla de configuración
12:46 min - 29

Interfaces de Unity que parecen juegos profesionales
02:41 min
Genera lista de niveles con prefabs en Unity
Resumen
Crear una lista de niveles dinámica con prefabs de UI en Unity te permite escalar la selección de niveles sin diseñar cada botón manualmente. Aquí aprenderás a instanciar botones, conectar eventos de clic y manejar estados de juego en el GameManager para que tu menú funcione como en un proyecto profesional.
Cómo organizar los prefabs de UI antes de generar la lista
Antes de tocar código, conviene ordenar los assets para que el flujo no se vuelva un caos cuando el proyecto crezca.
Dentro de la carpeta de prefabs, crea dos subcarpetas: una llamada Pieces y otra llamada UI. Mueve todas las piezas existentes a Pieces y reserva UI para los elementos de interfaz. Luego, toma uno de los botones del contenedor de la lista de niveles, renómbralo de BTN Options a BTN Level Option y arrástralo a la carpeta UI para convertirlo en prefab.
Una vez tengas el prefab, elimina los botones que sobran del contenedor. La idea es que la lista no exista en la escena, sino que se genere por código según la cantidad de niveles que definas. [00:30]
¿Qué es un prefab en Unity? Es una plantilla reutilizable de un GameObject que puedes instanciar muchas veces en runtime. Cualquier cambio en el prefab original se replica en todas sus instancias.
Cómo crear el script UI Level Selection para instanciar botones
El script UI Level Selection es el corazón de esta lógica: genera los botones, asigna sus textos y conecta el evento de clic.
Dentro del GameObject UI Level Selection, agrega un nuevo script con ese mismo nombre. En Visual Studio, declara tres propiedades públicas:
public GameObject levelButtonPrefabpara el prefab del botón.public GameObject levelListContainerpara el contenedor donde se instancian los botones.public int levelAmountpara la cantidad de niveles a crear.
En la función Start, usa un for loop que recorra desde cero hasta levelAmount. En cada iteración instancia un nuevo objeto como hijo del contenedor:
csharp for (int i = 0; i < levelAmount; i++) { var newObject = Instantiate(levelButtonPrefab, levelListContainer.transform); newObject.GetComponentInChildren<TextMeshProUGUI>().text = "Level " + i.ToString(); newObject.GetComponent<Button>().onClick.AddListener(levelButtonClicked); }
Para que el código compile, agrega using TMPro; y using UnityEngine.UI; en la parte superior del archivo. El primer namespace habilita TextMeshProUGUI y el segundo habilita el componente Button. [02:30]
Cómo conectar el evento onClick a una función personalizada
La función levelButtonClicked se ejecuta cuando el jugador toca un botón de nivel y le indica al GameManager que arranque la partida con GameManager.Instance.StartGame().
También necesitas una función public void backButtonPressed() que llame a GameManager.Instance.Idle() para regresar a la pantalla de inicio. Esa función Idle todavía no existe, así que toca crearla.
Cómo agregar el estado Level Selection al GameManager
Hasta ahora el GameManager manejaba tres estados: idle, in game y game over. Para soportar la nueva pantalla, debes añadir un estado más llamado Level Selection y dos funciones públicas que cambien a esos estados.
Dentro del GameManager agrega:
public void levelSelection()que asignaGameState.LevelSelectiony llama aOnGameStateUpdated.public void Idle()que asignaGameState.Idley llama aOnGameStateUpdated.
Con esto el flujo queda completo: el botón Start lleva al menú de niveles, el botón Back devuelve al menú principal y cada botón de nivel arranca el juego. [05:10]
¿Qué hace OnGameStateUpdated? Es la función que notifica a las pantallas de UI que el estado del juego cambió, para que cada una decida si mostrarse u ocultarse según su VisibleState.
Cómo configurar el componente UI Screen para animar la pantalla
El componente UI Screen ya existe en el proyecto y se encarga de las transiciones de entrada y salida. En el GameObject UI Level Selection configúralo así:
- Visible State: Level Selection.
- Transition Time: 0.5 segundos.
- Container Ref: el LevelList.
- Container Canvas: un Canvas Group dentro del mismo UI Level Selection.
- Background: el componente de imagen correspondiente.
En el inspector del UI Level Selection, asigna el Level Button Prefab (BTN Level Option), el Level List Container y un Level Amount inicial de 30. Desde la pantalla de inicio, cambia el evento del botón Start para que llame a levelSelection() en vez de StartGame().
Cómo controlar la opacidad del background con visibleAlpha
Al probar el flujo aparece un detalle visual: el background del Start Screen se vuelve totalmente opaco y tapa la animación al regresar. La causa está en el script UI Screen, que normaliza el alfa a uno en hideScreen y showScreen.
La solución es agregar una variable pública public float visibleAlpha = 1f y reemplazar el valor fijo en ambas funciones por esa variable. Así cada pantalla puede definir su propio nivel de opacidad sin afectar al resto.
Para el Start Screen, ajusta visibleAlpha a 0.8 para que el fondo permanezca semitransparente. Para el Level Selection, deja su Canvas Group en cero por defecto para que no se vea al iniciar el juego. [08:40]
Cómo probar el flujo completo de selección de niveles
Al darle play, el orden esperado es: pantalla de inicio visible, clic en Start, aparece la lista con 30 botones generados dinámicamente, scroll funcional y botón Back que regresa al menú principal.
Un detalle importante: el botón Back debe estar conectado en su onClick a UI Level Selection.backButtonPressed, no al script del Start Screen. Es un error fácil de pasar por alto y rompe el regreso al menú.
Todos los botones de nivel inician el mismo juego porque comparten la misma función StartGame. ¿Cómo modificarías la lógica para que cada botón cargue un nivel distinto? Cuéntame en los comentarios tu propuesta.