using System.Collections; using System.Collections.Generic; using UnityEngine; using static LaserBeam; public class LaserBeamController : MonoBehaviour { public float interval = 20f; public float chargeDuration = 3f; public float fireDuration = 1f; private List allLasers = new List(); private List> batches = new List>(); private List activeLasers = new List(); private float timer = 0f; private LaserPhase currentPhase = LaserPhase.Idle; void Start() { allLasers.AddRange(FindObjectsOfType()); // Shuffle for (int i = 0; i < allLasers.Count; i++) { var temp = allLasers[i]; int rand = Random.Range(i, allLasers.Count); allLasers[i] = allLasers[rand]; allLasers[rand] = temp; } // Split into 3 batches int batchSize = Mathf.CeilToInt(allLasers.Count / 3f); for (int i = 0; i < allLasers.Count; i += batchSize) { batches.Add(allLasers.GetRange(i, Mathf.Min(batchSize, allLasers.Count - i))); } foreach (var lb in allLasers) lb.enabled = false; StartCoroutine(ActivateBatches()); } IEnumerator ActivateBatches() { for (int i = 0; i < batches.Count; i++) { activeLasers.AddRange(batches[i]); foreach (var laser in activeLasers) laser.enabled = true; Debug.Log($"Activated batch {i + 1}, syncing all {activeLasers.Count} lasers."); ResetAllLasers(); yield return new WaitForSeconds(interval); } } void Update() { if (activeLasers.Count == 0) return; timer += Time.deltaTime; switch (currentPhase) { case LaserPhase.Idle: if (timer >= chargeDuration) { timer = 0f; currentPhase = LaserPhase.Charging; foreach (var laser in activeLasers) laser.SetLaserPhase(LaserPhase.Charging); } break; case LaserPhase.Charging: foreach (var laser in activeLasers) laser.TickLaserDuringCharging(); if (timer >= 1f) { timer = 0f; currentPhase = LaserPhase.Firing; foreach (var laser in activeLasers) laser.SetLaserPhase(LaserPhase.Firing); } break; case LaserPhase.Firing: foreach (var laser in activeLasers) laser.TickLaserDuringFiring(); if (timer >= fireDuration) { timer = 0f; currentPhase = LaserPhase.Idle; foreach (var laser in activeLasers) laser.SetLaserPhase(LaserPhase.Idle); } break; } } void ResetAllLasers() { timer = 0f; currentPhase = LaserPhase.Idle; foreach (var laser in activeLasers) { laser.SetLaserPhase(LaserPhase.Idle); } } }