using System; using System.Collections; using RR.Common.Utility; using UnityEngine; namespace RR.Game2D.Entities { public class TransparentForeground : MonoBehaviour { [SerializeField] private float fadeDuration = 0.25f; [SerializeField, Range(0, 255)] private float targetAlpha = 100f; private const float STARTING_ALPHA = 255f; private Collider2D _collider; private SpriteRenderer[] _spriteRenderers; private void Awake() { _collider = GetComponent(); if (!_collider.isTrigger) _collider.isTrigger = true; _spriteRenderers = GetComponentsInChildren(); if (_collider == null) Debug.LogWarning($"[{nameof(TransparentForeground)}] Collider2D не найден на {gameObject.name}."); if (_spriteRenderers == null || _spriteRenderers.Length == 0) Debug.LogWarning($"[{nameof(TransparentForeground)}] SpriteRenderer'ы не найдены на {gameObject.name} и его дочерних объектах."); if (_spriteRenderers == null) return; float initialAlpha = MathUtils.Remap(STARTING_ALPHA, 0f, 255f, 0f, 1f); foreach (SpriteRenderer spriteRenderer in _spriteRenderers) { if (!Mathf.Approximately(spriteRenderer.color.a, initialAlpha)) { spriteRenderer.color = new Color(spriteRenderer.color.r, spriteRenderer.color.g, spriteRenderer.color.b, initialAlpha); } } } private void OnTriggerEnter2D(Collider2D other) { if (!other.CompareTag("Player")) return; StopAllCoroutines(); StartCoroutine(Fade(targetAlpha)); } private void OnTriggerExit2D(Collider2D other) { if (!other.CompareTag("Player")) return; StopAllCoroutines(); StartCoroutine(Fade(STARTING_ALPHA)); } private IEnumerator Fade(float targetFadeAlpha) { float elapsed = 0f; float targetAlphaNormalized = MathUtils.Remap(targetFadeAlpha, 0f, 255f, 0f, 1f); // Сохраняем начальные цвета всех спрайтов Color[] initialColors = new Color[_spriteRenderers.Length]; Color[] targetColors = new Color[_spriteRenderers.Length]; for (int i = 0; i < _spriteRenderers.Length; i++) { initialColors[i] = _spriteRenderers[i].color; targetColors[i] = new Color(initialColors[i].r, initialColors[i].g, initialColors[i].b, targetAlphaNormalized); } // Интерполируем все спрайты одновременно while (elapsed < fadeDuration) { elapsed += Time.deltaTime; float t = elapsed / fadeDuration; for (int i = 0; i < _spriteRenderers.Length; i++) { _spriteRenderers[i].color = Color.Lerp(initialColors[i], targetColors[i], t); } yield return null; } // Устанавливаем финальные значения for (int i = 0; i < _spriteRenderers.Length; i++) { _spriteRenderers[i].color = targetColors[i]; } } } }