Files
2026-03-17 18:10:00 +02:00

205 lines
6.5 KiB
C#

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<ParticleSystem>();
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<RestartManager>();
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<RestartManager>();
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;
}
}