205 lines
6.5 KiB
C#
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;
|
|
}
|
|
}
|