93 lines
3.5 KiB
C#
93 lines
3.5 KiB
C#
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];
|
||
}
|
||
}
|
||
}
|
||
} |