Danro/Assets/Scripts/Entities/Props/TransparentForeground.cs

93 lines
3.5 KiB
C#
Raw Permalink 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 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<Collider2D>();
if (!_collider.isTrigger) _collider.isTrigger = true;
_spriteRenderers = GetComponentsInChildren<SpriteRenderer>();
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];
}
}
}
}