using UnityEngine; // Crea meteoritos nuevos cada cierto tiempo, en una posición X al azar, // justo por encima del borde superior de la pantalla. public class MeteorSpawner : MonoBehaviour { [Header("Meteoritos")] public GameObject meteorPrefab; // Cada cuántos segundos cae un meteorito nuevo. public float intervaloEntreMeteoritos = 3f; // Qué tan fuerte puede ser el empujón lateral inicial (hacia la izquierda o la // derecha). Con esto los meteoritos no caen todos derechito hacia abajo. public float velocidadLateralMaxima = 2f; private float minX, maxX, topY; void Start() { CalcularLimitesDePantalla(); // InvokeRepeating llama a un método una y otra vez, cada cierto intervalo de tiempo, // sin que nosotros tengamos que llevar la cuenta del tiempo a mano en Update(). InvokeRepeating(nameof(CrearMeteorito), intervaloEntreMeteoritos, intervaloEntreMeteoritos); } 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; // un poco arriba del borde, para que aparezca "cayendo" } void CrearMeteorito() { // Random.Range(min, max) devuelve un número al azar entre esos dos valores. float posicionX = Random.Range(minX, maxX); Vector3 posicionDeAparicion = new Vector3(posicionX, topY, 0f); GameObject meteorito = Instantiate(meteorPrefab, posicionDeAparicion, Quaternion.identity); // Le damos un empujón lateral al azar. La gravedad se encarga de acelerarlo hacia // abajo, así que el resultado es una caída en ángulo (una curva), no una línea recta. Rigidbody2D rb = meteorito.GetComponent(); float impulsoLateral = Random.Range(-velocidadLateralMaxima, velocidadLateralMaxima); rb.linearVelocity = new Vector2(impulsoLateral, 0f); } }