using UnityEngine; using UnityEngine.UI; /// /// Полноэкранный визуальный эффект акустического ослепления (подавления чувств). /// Активируется во время крика Босса: полностью затемняет экран и гасит эхолокацию. /// public class AcousticJammerOverlay : MonoBehaviour { private Image overlayImage; private CanvasGroup canvasGroup; private float currentAlpha = 0f; public static AcousticJammerOverlay Create(Transform hudCanvas) { var old = hudCanvas.Find("AcousticJammerOverlay"); if (old != null) DestroyImmediate(old.gameObject); GameObject root = new GameObject("AcousticJammerOverlay", typeof(RectTransform), typeof(CanvasGroup)); root.transform.SetParent(hudCanvas, false); RectTransform rt = root.GetComponent(); rt.anchorMin = Vector2.zero; rt.anchorMax = Vector2.one; rt.sizeDelta = Vector2.zero; // Черный экран с легким темно-багровым оттенком GameObject imgObj = new GameObject("VignetteBlackout", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image)); imgObj.transform.SetParent(root.transform, false); RectTransform imgRt = imgObj.GetComponent(); imgRt.anchorMin = Vector2.zero; imgRt.anchorMax = Vector2.one; imgRt.sizeDelta = Vector2.zero; Image img = imgObj.GetComponent(); img.color = new Color(0.01f, 0.005f, 0.005f, 0.98f); img.raycastTarget = false; AcousticJammerOverlay overlay = root.AddComponent(); overlay.overlayImage = img; overlay.canvasGroup = root.GetComponent(); overlay.canvasGroup.alpha = 0f; overlay.canvasGroup.blocksRaycasts = false; overlay.canvasGroup.interactable = false; return overlay; } private void Awake() { if (canvasGroup == null) canvasGroup = GetComponent(); } private void Update() { bool isBlinded = EchoTrigger.Instance != null && EchoTrigger.Instance.IsBlinded; float targetAlpha = isBlinded ? 1f : 0f; float speed = isBlinded ? 14f : 3.5f; // Мгновенно ослепляет, плавно возвращает зрение currentAlpha = Mathf.MoveTowards(currentAlpha, targetAlpha, speed * Time.deltaTime); if (canvasGroup != null) { canvasGroup.alpha = currentAlpha; } } }