using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; public class LightWave : MonoBehaviour { public float growSpeed = 2f; public float maxMultiplier = 9f; public bool isFront = false; public Camera heroCamera; public TextMeshProUGUI waveText; [HideInInspector] public bool showBothTextsAtOnce = false; [HideInInspector] public LightWave wave2ref; [HideInInspector] public float _eventTime; [HideInInspector] public bool _textSet = false; private bool _running = false; private float _sizeMultiplier = 1f; private ParticleSystem _ps; private float _baseStartSize; private const double SpeedOfLight = 299792458.0; private const double HeroSpeed = 10.0; private const double DroneSpeed = 40.0; private const double DistFront = 9.99; private const double DistBack = 9.57; private const double DistObserver = 20.0; void Awake() { _ps = GetComponent(); var main = _ps.main; _baseStartSize = main.startSizeMultiplier; _ps.Stop(); gameObject.SetActive(false); if (waveText != null) waveText.gameObject.SetActive(false); } public void StartWave() { gameObject.SetActive(true); _ps.Play(); _running = true; _eventTime = Time.time; _sizeMultiplier = 1f; _textSet = false; showBothTextsAtOnce = false; wave2ref = null; bool isDrone = GameManager.Instance != null && GameManager.Instance.useDrone; if (isDrone) { var main = _ps.main; main.startSizeMultiplier = _baseStartSize; return; } bool isView2 = GameManager.Instance != null && GameManager.Instance.isView2; if (!isView2) ShowText(this); } public void ShowTextForBoth() { ShowText(this); if (wave2ref != null) ShowText(wave2ref); } void Update() { if (!_running) return; bool isView2 = GameManager.Instance != null && GameManager.Instance.isView2; bool isDrone = GameManager.Instance != null && GameManager.Instance.useDrone; if (!isFront && !isView2 && !isDrone) { _sizeMultiplier += growSpeed * Time.deltaTime; _sizeMultiplier = Mathf.Min(_sizeMultiplier, maxMultiplier); var main = _ps.main; main.startSizeMultiplier = _baseStartSize * _sizeMultiplier; } } void ShowText(LightWave wave) { if (wave.waveText == null) return; bool isSimulation = GameManager.Instance != null && GameManager.Instance.isSimulation; bool isView2 = GameManager.Instance != null && GameManager.Instance.isView2; string label = wave.isFront ? "Хвилю 1" : "Хвилю 2"; double jitter = isView2 && GameManager.Instance != null ? GameManager.Instance.view2Jitter : 0.0; if (isSimulation) { double simC = 5000.0; double simV = GameManager.Instance != null ? GameManager.Instance.simV : 2000.0; double dist = isView2 ? (DistObserver + jitter) : (wave.isFront ? DistFront : DistBack); double relSpeed = isView2 ? simC : (wave.isFront ? (simC + simV) : (simC - simV)); double timeS = dist / relSpeed; wave.waveText.text = $"Зафіксували {label} через {timeS:F5} с"; } else { double dist = isView2 ? (DistObserver + jitter) : (wave.isFront ? DistFront : DistBack); double relSpeed = isView2 ? SpeedOfLight : (wave.isFront ? (SpeedOfLight + HeroSpeed) : (SpeedOfLight - HeroSpeed)); double timeNs = (dist / relSpeed) * 1e9; wave.waveText.text = $"Зафіксували {label} через {timeNs:F2} нс"; } wave.waveText.gameObject.SetActive(true); wave._textSet = true; if (!wave.isFront) { RestartManager rm = FindObjectOfType(); if (rm != null) rm.ShowRestart(); } } public void SetDroneText(bool front, bool isSimulation, float simDelay) { if (waveText == null) return; bool isView2 = GameManager.Instance != null && GameManager.Instance.isView2; string label = front ? "Хвилю 1" : "Хвилю 2"; double droneJitter = isView2 && GameManager.Instance != null ? GameManager.Instance.view2Jitter : 0.0; if (isSimulation) { double simC = 5000.0; double simV = GameManager.Instance != null ? GameManager.Instance.simVDrone : 3000.0; double dist = isView2 ? (DistObserver + droneJitter) : (front ? DistFront : DistBack); double relSpeed = isView2 ? simC : (front ? (simC + simV) : (simC - simV)); double timeS = dist / relSpeed; waveText.text = $"Зафіксували {label} через {timeS:F5} с"; } else { double dist = isView2 ? (DistObserver + droneJitter) : (front ? DistFront : DistBack); double relSpeed; if (isView2) relSpeed = SpeedOfLight; else relSpeed = front ? (SpeedOfLight + DroneSpeed) : (SpeedOfLight - DroneSpeed); double timeNs = (dist / relSpeed) * 1e9; waveText.text = $"Зафіксували {label} через {timeNs:F2} нс"; } waveText.gameObject.SetActive(true); _textSet = true; if (!front) { RestartManager rm = FindObjectOfType(); if (rm != null) rm.ShowRestart(); } } bool IsAnyPartVisible(Camera cam, Vector3 center, float radius) { Vector3[] points = { center + Vector3.forward * radius, center + Vector3.back * radius, center + Vector3.left * radius, center + Vector3.right * radius, center + Vector3.up * radius, center + Vector3.down * radius }; foreach (var p in points) { Vector3 v = cam.WorldToViewportPoint(p); if (v.z > 0 && v.x >= 0 && v.x <= 1 && v.y >= 0 && v.y <= 1) return true; } return false; } public void ResetText() { _textSet = false; if (waveText != null) waveText.gameObject.SetActive(false); } public void ResetSize() { _sizeMultiplier = 1f; var main = _ps.main; main.startSizeMultiplier = _baseStartSize; } }