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

59 lines
2.1 KiB
C#

using System.Collections;
using UnityEngine;
namespace Michsky.UI.Heat
{
[AddComponentMenu("Heat UI/Animation/Shiny Image")]
public class ShinyImage : MonoBehaviour
{
[Header("Resources")]
[SerializeField] private RectTransform targetRect;
[SerializeField] private RectTransform parentRect;
[Header("Animation")]
[SerializeField][Range(0, 4)] private float delay = 0.25f;
[SerializeField] [Range(0.25f, 4)] private float animationSpeed = 1;
[SerializeField] private AnimationCurve animationCurve = new AnimationCurve(new Keyframe(0.0f, 0.0f), new Keyframe(1.0f, 1.0f));
void OnEnable()
{
StartShiny();
}
public void StartShiny()
{
gameObject.SetActive(true);
if (targetRect == null) { targetRect = GetComponent<RectTransform>(); }
if (parentRect == null) { parentRect = transform.parent.GetComponent<RectTransform>(); }
StopCoroutine("ShinyAnimation");
StartCoroutine("ShinyAnimation");
}
IEnumerator ShinyAnimation()
{
float elapsedTime = 0;
Vector2 startPos = new Vector2(-parentRect.sizeDelta.x, targetRect.anchoredPosition.y);
Vector2 endPos = new Vector2(+parentRect.sizeDelta.x, targetRect.anchoredPosition.y);
targetRect.anchoredPosition = startPos;
while (targetRect.anchoredPosition.x < endPos.x - 0.1f)
{
elapsedTime += Time.unscaledDeltaTime;
targetRect.anchoredPosition = new Vector2(Mathf.Lerp(startPos.x, endPos.x, animationCurve.Evaluate(elapsedTime * animationSpeed)), targetRect.anchoredPosition.y);
yield return null;
}
targetRect.anchoredPosition = endPos;
if (delay == 0) { StartCoroutine("ShinyAnimation"); }
else { StartCoroutine("ShinyAnimationDelay"); }
}
IEnumerator ShinyAnimationDelay()
{
yield return new WaitForSecondsRealtime(delay);
StartCoroutine("ShinyAnimation");
}
}
}