118 lines
3.3 KiB
C#
118 lines
3.3 KiB
C#
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<LaserBeam> allLasers = new List<LaserBeam>();
|
|
private List<List<LaserBeam>> batches = new List<List<LaserBeam>>();
|
|
private List<LaserBeam> activeLasers = new List<LaserBeam>();
|
|
|
|
private float timer = 0f;
|
|
private LaserPhase currentPhase = LaserPhase.Idle;
|
|
|
|
void Start()
|
|
{
|
|
allLasers.AddRange(FindObjectsOfType<LaserBeam>());
|
|
|
|
// 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);
|
|
}
|
|
}
|
|
}
|