Kursach_StealthAction/Assets/Scripts/MenuEcholocationRadar.cs

136 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
using UnityEngine.UI;
public class MenuEcholocationRadar : MonoBehaviour
{
[Header("Настройки волн эхолокации")]
public int maxSimultaneousWaves = 4;
public float waveMaxRadius = 1400f;
public float waveSpeed = 220f;
public float waveSpawnInterval = 1.6f;
public float initialThickness = 16f;
public float maxThickness = 48f;
[Header("Цветовая палитра волн (Dark Sci-Fi - Yellow)")]
public Color waveBaseColor = new Color(1.00f, 0.85f, 0.10f, 0.85f); // Неоновый желтый
public Color waveCoreColor = new Color(1.00f, 0.98f, 0.55f, 1.00f); // Яркое ядро
public Color beaconColor = new Color(1.00f, 0.88f, 0.15f, 1.00f);
[Header("Радарный маяк (В углу экрана)")]
public Image radarBeaconDot;
public Image radarReticle;
private class WaveInstance
{
public MenuEchoWaveRenderer renderer;
public float radius;
public bool active;
public float delay;
}
private WaveInstance[] waves;
private float spawnTimer = 0f;
private void Awake()
{
InitializeWaves();
}
private void InitializeWaves()
{
waves = new WaveInstance[maxSimultaneousWaves];
for (int i = 0; i < maxSimultaneousWaves; i++)
{
GameObject waveObj = new GameObject($"EchoWave_{i + 1}");
waveObj.transform.SetParent(transform, false);
RectTransform rt = waveObj.AddComponent<RectTransform>();
rt.anchorMin = new Vector2(0.5f, 0.5f);
rt.anchorMax = new Vector2(0.5f, 0.5f);
rt.pivot = new Vector2(0.5f, 0.5f);
rt.anchoredPosition = Vector2.zero;
MenuEchoWaveRenderer renderer = waveObj.AddComponent<MenuEchoWaveRenderer>();
renderer.raycastTarget = false;
waves[i] = new WaveInstance
{
renderer = renderer,
radius = 0f,
active = false,
delay = i * waveSpawnInterval // Заранее распределяем фазы волн
};
}
}
private void Update()
{
float dt = Time.unscaledDeltaTime;
// Запуск первой волны сразу, остальных — по интервалу
spawnTimer += dt;
if (spawnTimer >= waveSpawnInterval)
{
spawnTimer = 0f;
TriggerNextWave();
}
// Обновление всех активных волн
for (int i = 0; i < waves.Length; i++)
{
var w = waves[i];
if (!w.active) continue;
w.radius += waveSpeed * dt;
float progress = Mathf.Clamp01(w.radius / waveMaxRadius);
// Плавное появление (Fade-in) в начале и плавное растворение (Fade-out) к краю экрана
float fadeIn = Mathf.SmoothStep(0f, 1f, progress / 0.15f);
float fadeOut = Mathf.Pow(1f - progress, 1.4f);
float alpha = fadeIn * fadeOut;
// Расширение полосы с увеличением радиуса (физика дисперсии звуковой волны)
float currentThickness = Mathf.Lerp(initialThickness, maxThickness, progress);
w.renderer.SetWave(w.radius, currentThickness, alpha, waveBaseColor, waveCoreColor);
if (w.radius >= waveMaxRadius)
{
w.active = false;
w.radius = 0f;
w.renderer.SetWave(0f, 0f, 0f, waveBaseColor, waveCoreColor);
}
}
// Пульсация маяка в центре радара
if (radarBeaconDot != null)
{
float pulse = Mathf.PingPong(Time.unscaledTime * 2.5f, 1f);
float scale = Mathf.Lerp(0.85f, 1.25f, pulse);
radarBeaconDot.transform.localScale = new Vector3(scale, scale, 1f);
Color c = beaconColor;
c.a = Mathf.Lerp(0.5f, 1f, pulse);
radarBeaconDot.color = c;
}
if (radarReticle != null)
{
radarReticle.transform.Rotate(0f, 0f, -12f * dt);
}
}
private void TriggerNextWave()
{
for (int i = 0; i < waves.Length; i++)
{
if (!waves[i].active)
{
waves[i].active = true;
waves[i].radius = 0f;
return;
}
}
}
}