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

95 lines
3.4 KiB
C#

using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
namespace Michsky.UI.Heat
{
[RequireComponent(typeof(Image))]
[AddComponentMenu("Heat UI/Animation/Image Fading")]
public class ImageFading : MonoBehaviour
{
[Header("Settings")]
[SerializeField] private bool doPingPong = false;
[SerializeField] [Range(0.5f, 12)] private float fadeSpeed = 2f;
[SerializeField] private AnimationCurve fadeCurve = new AnimationCurve(new Keyframe(0.0f, 0.0f), new Keyframe(1.0f, 1.0f));
[SerializeField] private EnableBehaviour enableBehaviour;
[Header("Events")]
public UnityEvent onFadeIn;
public UnityEvent onFadeInEnd;
public UnityEvent onFadeOut;
public UnityEvent onFadeOutEnd;
// Helpers
Image targetImg;
public enum EnableBehaviour { None, FadeIn, FadeOut }
void OnEnable()
{
if (enableBehaviour == EnableBehaviour.FadeIn) { FadeIn(); }
else if (enableBehaviour == EnableBehaviour.FadeOut) { FadeOut(); }
}
public void FadeIn()
{
if (gameObject.activeSelf == false) { gameObject.SetActive(true); }
if (targetImg == null) { targetImg = GetComponent<Image>(); }
targetImg.color = new Color(targetImg.color.r, targetImg.color.g, targetImg.color.b, 0);
onFadeIn.Invoke();
StopCoroutine("DoFadeIn");
StopCoroutine("DoFadeOut");
StartCoroutine("DoFadeIn");
}
public void FadeOut()
{
if (gameObject.activeSelf == false) { gameObject.SetActive(true); }
if (targetImg == null) { targetImg = GetComponent<Image>(); }
targetImg.color = new Color(targetImg.color.r, targetImg.color.g, targetImg.color.b, 1);
onFadeOut.Invoke();
StopCoroutine("DoFadeIn");
StopCoroutine("DoFadeOut");
StartCoroutine("DoFadeOut");
}
IEnumerator DoFadeIn()
{
Color startingPoint = new Color(targetImg.color.r, targetImg.color.g, targetImg.color.b, 0);
float elapsedTime = 0;
while (targetImg.color.a < 0.99f)
{
elapsedTime += Time.unscaledDeltaTime;
targetImg.color = Color.Lerp(startingPoint, new Color(startingPoint.r, startingPoint.g, startingPoint.b, 1), fadeCurve.Evaluate(elapsedTime * fadeSpeed)); ;
yield return null;
}
targetImg.color = new Color(targetImg.color.r, targetImg.color.g, targetImg.color.b, 1);
onFadeInEnd.Invoke();
if (doPingPong == true) { StartCoroutine("DoFadeOut"); }
}
IEnumerator DoFadeOut()
{
Color startingPoint = targetImg.color;
float elapsedTime = 0;
while (targetImg.color.a > 0.01f)
{
elapsedTime += Time.unscaledDeltaTime;
targetImg.color = Color.Lerp(startingPoint, new Color(startingPoint.r, startingPoint.g, startingPoint.b, 0), fadeCurve.Evaluate(elapsedTime * fadeSpeed)); ;
yield return null;
}
targetImg.color = new Color(targetImg.color.r, targetImg.color.g, targetImg.color.b, 0);
onFadeOutEnd.Invoke();
gameObject.SetActive(false);
}
}
}