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.