Initial commit
This commit is contained in:
204
Assets/Scripts/LightWave.cs
Normal file
204
Assets/Scripts/LightWave.cs
Normal file
@@ -0,0 +1,204 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user