StationObscurum/Assets/Packages/Heat - Complete Modern UI/Scripts/Animation/ImagePulse.cs
2024-02-01 22:45:59 -05:00

70 lines
2.6 KiB
C#

using System.Collections;
using UnityEngine;
using UnityEngine.UI;
namespace Michsky.UI.Heat
{
[AddComponentMenu("Heat UI/Animation/Image Pulse")]
public class ImagePulse : MonoBehaviour
{
[Header("Resources")]
[SerializeField] private Image targetImage;
[Header("Color")]
[Range(0, 1)] public float minAlpha = 0.25f;
[Range(0, 1)] public float maxAlpha = 1;
[Header("Animation")]
[Range(0.5f, 10)] public float pulseSpeed = 1;
[SerializeField] private AnimationCurve pulseCurve = new AnimationCurve(new Keyframe(0.0f, 0.0f), new Keyframe(1.0f, 1.0f));
void OnEnable()
{
StartPulse();
}
public void StartPulse()
{
if (gameObject.activeSelf == false) { gameObject.SetActive(true); }
if (targetImage == null) { targetImage = GetComponent<Image>(); }
targetImage.color = new Color(targetImage.color.r, targetImage.color.g, targetImage.color.b, minAlpha);
StopCoroutine("PulseInAnimation");
StopCoroutine("PulseOutAnimation");
StartCoroutine("PulseInAnimation");
}
IEnumerator PulseInAnimation()
{
float elapsedTime = 0;
targetImage.color = new Color(targetImage.color.r, targetImage.color.g, targetImage.color.b, minAlpha);
while (targetImage.color.a < maxAlpha)
{
elapsedTime += Time.unscaledDeltaTime;
targetImage.color = new Color(targetImage.color.r, targetImage.color.g, targetImage.color.b, Mathf.Lerp(minAlpha, maxAlpha, pulseCurve.Evaluate(elapsedTime * pulseSpeed)));
yield return null;
}
targetImage.color = new Color(targetImage.color.r, targetImage.color.g, targetImage.color.b, maxAlpha);
StartCoroutine("PulseOutAnimation");
}
IEnumerator PulseOutAnimation()
{
float elapsedTime = 0;
targetImage.color = new Color(targetImage.color.r, targetImage.color.g, targetImage.color.b, maxAlpha);
while (targetImage.color.a > minAlpha)
{
elapsedTime += Time.unscaledDeltaTime;
targetImage.color = new Color(targetImage.color.r, targetImage.color.g, targetImage.color.b, Mathf.Lerp(maxAlpha, minAlpha, pulseCurve.Evaluate(elapsedTime * pulseSpeed)));
yield return null;
}
targetImage.color = new Color(targetImage.color.r, targetImage.color.g, targetImage.color.b, minAlpha);
StartCoroutine("PulseInAnimation");
}
}
}