using System.Collections; using System.Collections.Generic; using UnityEngine; public class Spawner : MonoBehaviour { // Reference to the Prefab to Spawn [SerializeField] private GameObject objectToSpawn; // Time interval between spawns public float spawnInterval = 1f; [SerializeField] private int maxAlive = 0; [SerializeField] private bool spawnOnStart = true; [SerializeField] private bool repeatSpawns = true; [SerializeField] private float launchForce = 0f; [SerializeField] private float launchRandomAngle = 0f; [SerializeField] private float spinSpeed = 0f; private readonly List spawned = new List(); private void OnEnable() { if (spawnOnStart) { SpawnOnce(); } } void Start() { if (repeatSpawns) { // Start the spawning process using a Coroutine StartCoroutine(SpawnRoutine()); } } private void Update() { if (spinSpeed != 0f) { transform.Rotate(0f, 0f, spinSpeed * Time.deltaTime); } } public void SpawnNow() { SpawnOnce(); } private IEnumerator SpawnRoutine() { // Infinite loop to keep spawning (can be modified) while (true) { // Wait for the specified interval yield return new WaitForSeconds(spawnInterval); if (objectToSpawn == null) { continue; } if (maxAlive > 0 && CountAlive() >= maxAlive) { continue; } SpawnOnce(); } } private void SpawnOnce() { if (objectToSpawn == null) { return; } if (maxAlive > 0 && CountAlive() >= maxAlive) { return; } var instance = Instantiate(objectToSpawn, transform.position, Quaternion.identity); spawned.Add(instance); if (launchForce > 0f && instance.TryGetComponent(out var body)) { var angleOffset = launchRandomAngle > 0f ? Random.Range(-launchRandomAngle, launchRandomAngle) : 0f; var direction = Quaternion.Euler(0f, 0f, angleOffset) * transform.right; body.AddForce(direction.normalized * launchForce, ForceMode2D.Impulse); } } private int CountAlive() { for (var i = spawned.Count - 1; i >= 0; i--) { if (spawned[i] == null) { spawned.RemoveAt(i); } } return spawned.Count; } }