Sprites aleatorios de prefabs en Unity

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

Resumen

Genera un tablero visual atractivo en segundos: con C# en Unity, basta con tres cambios para que cada casilla muestre un caramelo aleatorio en lugar de un cuadrado. Aquí verás cómo usar lista de sprites, Random.Range, SpriteRenderer y un identificador único (ID) provisional para dejarlo todo listo antes de optimizar.

¿Cómo generar caramelos aleatorios con C# en Unity?

Para reemplazar el cuadrado por caramelos, la clave es intervenir justo antes de añadir el nuevo caramelo al array/colección. La idea: tomar un sprite de los prefabs de forma aleatoria, asignarlo al SpriteRenderer del objeto y establecer un ID temporal. El proceso es directo y evita cambios estructurales.

  • Usar instanciación del caramelo y, antes de agregarlo al array, configurar su gráfico.
  • Elegir uno aleatorio de la lista de sprites usando Random.Range con distribución uniforme por defecto.
  • Reemplazar la imagen del cuadrado por el sprite seleccionado.
  • Asignar un ID provisional hardcodeado para cada caramelo.

¿Qué líneas cambian para seleccionar un sprite de prefabs?

  • Selecciona un sprite al azar del array/lista configurada de sprites/prefabs.
// 1) Elegir un sprite aleatorio de la lista
Sprite newSprite = sprites[UnityEngine.Random.Range(0, sprites.Count)];

// 2) Asignarlo al SpriteRenderer del nuevo caramelo
newCandy.GetComponent<SpriteRenderer>().sprite = newSprite;
  • Notas clave: Random.Range(0, n) para enteros devuelve un valor entre 0 (incluido) y n (excluido). Si tienes 6 caramelos, los índices irán de 0 a 5.

¿Cómo asignar un identificador único provisional?

  • Configura un ID temporal para diferenciar caramelos. Evita usar 0 si está reservado en colecciones; utiliza -1 como valor “no válido”.
// 3) Asignar un ID provisional (hardcodeado)
newCandy.GetComponent<Candy>().Id = -1;
  • Este DNI/ID se calculará automáticamente más adelante. De momento se deja hardcodeado para avanzar rápido.

¿Dónde insertar el código en el word manager?

El cambio debe colocarse entre el renombrado del nuevo caramelo y su inserción en la colección de caramelos. Así te aseguras de que, cuando se agregue al array, ya tenga su SpriteRenderer configurado y su ID establecido.

  • Insertar las 3 líneas tras la instanciación de newCandy.
  • Hacerlo antes de añadir el objeto al array/lista del tablero.
  • Mantener el resto del flujo sin cambios.

Ejemplo de ubicación en pseudocódigo:

var newCandy = Instantiate(currentCandy, position, rotation);

// aquí: configurar gráfico e ID antes de añadirlo a la colección
Sprite newSprite = sprites[UnityEngine.Random.Range(0, sprites.Count)];
newCandy.GetComponent<SpriteRenderer>().sprite = newSprite;
newCandy.GetComponent<Candy>().Id = -1;

candies[row, col] = newCandy; // ahora sí, se agrega a la colección

Conceptos trabajados aquí: instanciación, colección/array, SpriteRenderer, lista de sprites, Random.Range, ID único. Además, se menciona la distribución uniforme como base; más adelante se verán otras distribuciones de probabilidad.

¿Qué validar en el editor y qué problemas aleatorios surgen?

Antes de ejecutar, verifica el guardado del script en el editor. El icono de círculo indica cambios sin guardar; al usar Ctrl+S (Windows) o Command+S (Mac) desaparece y se muestra una equis. Luego presiona play para ver el tablero con caramelos.

  • Guardar siempre el script antes de compilar y dar a play.
  • Confirmar que aparecen caramelos y no cuadrados.
  • Notar la aleatoriedad de cada partida: el orden cambia en cada ejecución.

Durante la prueba se detectan efectos de la aleatoriedad inicial:

  • Aparición de tripletes o cadenas largas al empezar.
  • Ejemplo: varias sandías alineadas o una fila con seis caracolas consecutivas.
  • Estos casos se corregirán con lógica adicional que usará el ID y validaciones de vecinos (arriba, abajo, izquierda, derecha) para evitar coincidencias iniciales.

¿Quieres que profundicemos en cómo calcular el ID automáticamente y prevenir tripletes desde el inicio? Deja tu duda o comentario y lo abordamos en el siguiente paso.