using UnityEngine; // Crea enemigos con el tiempo, alternando al azar entre los dos tipos, y hace que // aparezcan cada vez más seguido: así el juego se pone más difícil solo. public class EnemySpawner : MonoBehaviour { [Header("Prefabs de enemigos")] public GameObject enemigoQueSeAproximaPrefab; public GameObject enemigoQueDisparaPrefab; [Header("Dificultad progresiva")] // Cada cuánto aparece un enemigo nuevo, al empezar el juego. public float intervaloInicial = 2.5f; // El intervalo nunca va a bajar de este valor, para que el juego siga siendo jugable. public float intervaloMinimo = 0.6f; // Cuánto se reduce el intervalo cada vez que aparece un enemigo nuevo. public float reduccionPorAparicion = 0.05f; private float intervaloActual; private float proximaAparicion; private float minX, maxX, topY; void Start() { intervaloActual = intervaloInicial; CalcularLimitesDePantalla(); proximaAparicion = Time.time + intervaloActual; } void CalcularLimitesDePantalla() { Camera camara = Camera.main; Vector3 esquinaInferior = camara.ViewportToWorldPoint(new Vector3(0f, 0f, 0f)); Vector3 esquinaSuperior = camara.ViewportToWorldPoint(new Vector3(1f, 1f, 0f)); minX = esquinaInferior.x; maxX = esquinaSuperior.x; topY = esquinaSuperior.y + 1f; } void Update() { // El mismo patrón de "cooldown" con Time.time que usamos para el disparo de la // nave en el Módulo 2. A diferencia del InvokeRepeating del Módulo 3, acá el // intervalo va cambiando, así que necesitamos controlarlo nosotros mismos. if (Time.time >= proximaAparicion) { CrearEnemigo(); // Reducimos el intervalo para que el próximo enemigo tarde menos en aparecer, // sin bajar nunca del mínimo. intervaloActual = Mathf.Max(intervaloMinimo, intervaloActual - reduccionPorAparicion); proximaAparicion = Time.time + intervaloActual; } } void CrearEnemigo() { // Random.value devuelve un número al azar entre 0 y 1: lo usamos como // "moneda al aire" para elegir uno de los dos tipos de enemigo. GameObject prefabElegido = Random.value < 0.5f ? enemigoQueSeAproximaPrefab : enemigoQueDisparaPrefab; float posicionX = Random.Range(minX, maxX); Vector3 posicionDeAparicion = new Vector3(posicionX, topY, 0f); Instantiate(prefabElegido, posicionDeAparicion, Quaternion.identity); } }