using System.Collections; using System.Collections.Generic; using UnityEngine; namespace BulletHellTemplate { /// /// Spawns boxes at defined intervals within a specified area, avoiding obstacles with certain tags. /// public class BoxSpawner : MonoBehaviour { [Header("Spawner Settings")] public int maxBoxes = 5; // Maximum number of boxes to maintain in the scene public float spawnCooldown = 5f; // Cooldown in seconds between spawns public GameObject boxPrefab; // Prefab of the BoxEntity to spawn public float spawnRadius = 10f; // Radius within which boxes can be spawned private List currentBoxes = new List(); // List to keep track of spawned boxes private float cooldownTimer; // Timer to track cooldown between spawns void Start() { cooldownTimer = spawnCooldown; } void Update() { // Do not update the spawner if the game is paused if (GameplayManager.Singleton.IsPaused()) return; cooldownTimer -= Time.deltaTime; // Check if it's time to spawn a new box and if the max number hasn't been reached if (cooldownTimer <= 0 && currentBoxes.Count < maxBoxes) { SpawnBox(); cooldownTimer = spawnCooldown; // Reset cooldown timer } // Clean up null entries if boxes have been destroyed currentBoxes.RemoveAll(box => box == null); } /// /// Spawns a box at a random position within the spawn radius, avoiding walls. /// private void SpawnBox() { Vector3 spawnPoint = Vector3.zero; bool validPlacement = false; // Attempt to find a valid spawn location for (int attempts = 0; attempts < 10; attempts++) // Limit attempts to avoid infinite loops { spawnPoint = transform.position + Random.insideUnitSphere * spawnRadius; spawnPoint.y = transform.position.y; // Adjust spawn height to match the spawner's y position // Check for proximity to walls if (!Physics.CheckSphere(spawnPoint, 0.3f, LayerMask.GetMask("Wall"))) { validPlacement = true; break; } } if (validPlacement) { GameObject newBox = Instantiate(boxPrefab, spawnPoint, Quaternion.identity); currentBoxes.Add(newBox); } else { Debug.LogWarning("Failed to find a valid placement for the box after several attempts."); } } private void OnDrawGizmos() { Gizmos.color = Color.blue; Gizmos.DrawWireSphere(transform.position, spawnRadius); } } }