Configuración y Gestión del Tablero en Unity con C#

Clase 8 de 31Curso de Desarrollo de Videojuegos para Móviles con Unity

Resumen

Diseña un tablero sólido en Unity con una arquitectura clara y escalable. Aquí verás cómo estructurar un Board Manager que controla caramelos, aplica el patrón singleton y prepara la matriz bidimensional del juego con un offset preciso. Todo se apoya en buenas prácticas de C# y en la delegación de responsabilidades.

¿Qué hace el board manager en Unity?

El tablero actúa como mánager: gobierna a los caramelos y coordina su comportamiento. La idea clave es separar responsabilidades: el tablero dirige y los caramelos obedecen. Así evitamos que cada caramelo conozca a todos los demás y mantenemos el orden de la escena.

  • Centraliza la lógica del juego en un solo manager.
  • Define el tamaño del tablero con filas y columnas.
  • Controla el estado de intercambio con una bandera.
  • Mantiene una referencia al caramelo seleccionado.
  • Evita dependencias innecesarias entre caramelos.

Además, se opta por delegar tareas: en lugar de llenar el Start, se crea un método específico para la configuración inicial. Esta práctica mejora la legibilidad y el mantenimiento del código.

¿Cómo aplicar el patrón singleton correctamente?

Un manager debe existir una sola vez. Con un singleton, la clase garantiza una única instancia y elimina duplicados si aparecen. La convención: variable pública y estática del mismo tipo, llamada comúnmente sharedInstance. La inicialización se hace en Awake o en Start comparando con null.

using System.Collections.Generic; using UnityEngine; public class BoardManager : MonoBehaviour { // Singleton: única instancia compartida. public static BoardManager sharedInstance; void Awake() { if (sharedInstance == null) { sharedInstance = this; // este es el director válido. } else { Destroy(gameObject); // elimina directores duplicados. } } }

Claves del patrón:

  • variable pública y estática: una sola instancia accesible globalmente.
  • comprobación de null: primer director toma el cargo.
  • eliminación de duplicados: evita conflictos de control.

¿Qué variables definen el tablero y cómo se inicializa con offset?

La estructura del tablero combina una lista de gráficos, una matriz de objetos, tamaños y un estado de intercambio. Además, se prepara un método que crea el tablero inicial usando un offset obtenido del BoxCollider2D del caramelo actual para respetar márgenes en pantalla.

using System.Collections.Generic; using UnityEngine; public class BoardManager : MonoBehaviour { public static BoardManager sharedInstance; // Gráficos de los caramelos (actúan como si fueran *prefabs*). public List<Sprite> prefabs = new List<Sprite>(); // Caramelo actualmente seleccionado por el manager. public GameObject currentCandy; // Tamaño del tablero en X e Y. public int xSize, ySize; // Matriz bidimensional de caramelos en pantalla. private GameObject[,] candies; // Control del intercambio: propiedad con *getter* y *setter* estándar. public bool IsShifting { get; set; } void Start() { // Calcula el margen usando el tamaño del BoxCollider2D del caramelo. Vector2 offset = currentCandy.GetComponent<BoxCollider2D>().size; CreateInitialBoard(offset); } // Delegación: método dedicado a configurar el tablero inicial. private void CreateInitialBoard(Vector2 offset) { // Aquí se crearán las filas y columnas con bucles anidados. // Se usarán xSize e ySize para poblar 'candies'. // Se aplicará 'offset' para posicionar de forma espaciosa. } }

Puntos clave de la configuración:

  • lista de Sprite llamada «prefabs»: editable desde el editor.
  • GameObject currentCandy: referencia al caramelo activo.
  • enteros xSize, ySize: dimensiones del tablero.
  • matriz GameObject[,]: organización en filas y columnas.
  • bandera IsShifting: impide múltiples cambios simultáneos.
  • método CreateInitialBoard(Vector2 offset): prepara la colocación con margen.
  • delegación desde Start: código limpio y fácil de ampliar.

Buenas prácticas destacadas:

  • encapsular la matriz como privada: solo el manager conoce el conjunto.
  • usar propiedad automática para el estado: getter/setter sin lógica extra.
  • pensar la creación con dos bucles: uno para columnas y otro para filas.

¿Quieres que ampliemos con animaciones o con la lógica de llenado usando bucles anidados? Cuéntame qué parte te gustaría ver primero y en qué punto de Unity te quedaste.

      Configuración y Gestión del Tablero en Unity con C#