MiniGames/Assets/Scripts/CrateEscape/LaserBeamController.cs

117 lines
3.2 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;
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);
}
}
}