Cómo crear oleadas de dragones con portal

Clase 28 de 33Curso de VR con Unity

Resumen

Genera oleadas de dragones en Unity con control total: desde un portal que instancia enemigos con tiempos aleatorios hasta la preparación para que sigan un destino. Aprenderás a usar prefabs, corrutinas, arrays de GameObjects y funciones clave como StartCoroutine, Random.Range e Instantiate, evitando errores típicos al instanciar.

¿Cómo organizar prefabs y preparar el spawning?

Para ganar flexibilidad, se asigna a cada dragón un script de follow destination y se convierten en prefabs. Luego se elimina su presencia en escena y se crea un punto de spawning con un objeto vacío (create empty), que actuará como portal.

  • Asignar el script de follow destination a todos los dragones.
  • Convertir cada dragón en prefab arrastrándolo a la jerarquía de assets.
  • Eliminar las instancias de la escena para evitar duplicados.
  • Crear un objeto vacío como portal y ubicarlo donde convenga.
  • Preparar un script específico del portal para instanciar enemigos de forma escalonada.

¿Cómo programar el portal con una corrutina en Unity?

El portal usa una corrutina que instancia enemigos en tiempos aleatorios hasta completar un cupo. Se definen variables públicas para elegir prefabs y cantidad total. Se elimina Update porque no es necesario, y se inicia la corrutina en Start con StartCoroutine.

¿Qué variables públicas necesitas?

  • Un array público: GameObject[] enemies.
  • Un contador público: int numberOfEnemies.
  • El portal como objeto con este script y transform visibles.

¿Cómo instancias y pausas con aleatoriedad?

  • Elegir un enemigo aleatorio con Random.Range sobre el array.
  • Instanciar en la posición del portal con Instantiate.
  • Pausar con yield return new WaitForSeconds(Random.Range(min, max)).

¿Cómo inicias la corrutina?

  • Llamar a StartCoroutine en Start para que comience el flujo.
using UnityEngine;
using System.Collections;

public class Portal : MonoBehaviour
{
    public GameObject[] enemies;       // Prefabs disponibles.
    public int numberOfEnemies;        // Cupo total a generar.

    private void Start()
    {
        StartCoroutine(GenerateNewEnemy());
    }

    private IEnumerator GenerateNewEnemy()
    {
        for (int i = 0; i < numberOfEnemies; i++)
        {
            GameObject enemy = enemies[Random.Range(0, enemies.Length)];
            GameObject instance = Instantiate(enemy);
            instance.transform.position = transform.position; // Aparición en el portal.

            yield return new WaitForSeconds(Random.Range(10f, 20f));
        }
    }
}

Claves prácticas: - Dificultad controlada: la corrutina evita que todos aparezcan a la vez. - Ritmo impredecible: tiempos aleatorios hacen el juego más tenso. - Escalabilidad: el array permite añadir o quitar prefabs sin cambios extra.

¿Qué errores comunes y trucos de probabilidad debes evitar?

Un fallo típico con prefabs es no resetear la posición tras crearlos. Si el prefab conserva un transform distinto de 0,0,0, los enemigos aparecerán desplazados, incluso fuera de la zona visible. Solución: al crear los prefabs, resetear su posición a 0,0,0; haz lo mismo con el portal para coherencia.

  • Error frecuente: prefabs con posiciones antiguas en su transform.
  • Síntoma: enemigos instanciados detrás de montañas u objetos.
  • Solución: resetear a 0,0,0 antes de usarlos para spawning.
  • Consejo de probabilidad: para que un dragón salga más a menudo, repítelo más veces dentro de enemies. Cuantas más repeticiones, mayor probabilidad.
  • Ajuste rápido: definir un cupo, por ejemplo, 10 enemigos para probar el flujo.

¿Quieres que ampliemos el sistema con rutas de movimiento y destinos aleatorios? Comparte tus dudas o ideas en los comentarios y afinamos el comportamiento de tus dragones.