using System.Collections;
using UnityEngine;
using UnityEngine.UI;
namespace RR.Common.UI
{
///
/// Показывает красную экранную виньетку во время смерти игрока.
///
[AddComponentMenu("RR/UI/Death Vignette Controller")]
public class DeathVignetteController : MonoBehaviour
{
private const string RuntimeObjectName = "Death Vignette";
private const int TextureSize = 256;
private static DeathVignetteController _instance;
[Header("Визуал")]
[SerializeField] private Color vignetteColor = new(0.85f, 0.02f, 0.02f, 1f);
[SerializeField, Range(0f, 1f)] private float maxAlpha = 0.75f;
[SerializeField, Range(0.01f, 1f)] private float innerRadius = 0.3f;
[SerializeField, Range(0.01f, 1f)] private float outerRadius = 0.85f;
[Header("Анимация")]
[SerializeField, Min(0.01f)] private float fadeInDuration = 0.18f;
[SerializeField, Min(0.01f)] private float fadeOutDuration = 0.45f;
[SerializeField] private bool useUnscaledTime = true;
[Header("Ссылки")]
[SerializeField] private Image vignetteImage;
private Coroutine _fadeCoroutine;
private Canvas _canvas;
private Texture2D _texture;
public static DeathVignetteController Instance
{
get
{
if (_instance) return _instance;
return CreateRuntimeInstance();
}
}
private void Awake()
{
if (_instance != null && _instance != this)
{
Destroy(gameObject);
return;
}
_instance = this;
DontDestroyOnLoad(gameObject);
EnsureView();
SetAlpha(0f);
}
private void OnDestroy()
{
if (_instance == this)
{
_instance = null;
}
}
public void Show()
{
EnsureView();
FadeTo(maxAlpha, fadeInDuration);
}
public void Hide()
{
EnsureView();
FadeTo(0f, fadeOutDuration);
}
private static DeathVignetteController CreateRuntimeInstance()
{
GameObject root = new(RuntimeObjectName);
return root.AddComponent();
}
private void EnsureView()
{
if (vignetteImage)
{
return;
}
_canvas = GetComponent