Files
project-reset/Assets/Plugins/LiveWatchLite/TowerDefenceDemo/Scripts/UI/EnergyPanelUI.cs
2025-08-31 18:14:07 -04:00

74 lines
2.3 KiB
C#

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UI;
namespace Ingvar.LiveWatch.TowerDefenceDemo.UI
{
public class EnergyPanelUI : MonoBehaviour
{
[SerializeField] private float _animationExtraScale = 0.2f;
[SerializeField] private float _animationScaleDuration = 0.2f;
[SerializeField] private Text _energyText;
private LevelScene _levelScene;
private void Awake()
{
_levelScene = FindObjectOfType<LevelScene>();
}
private void OnEnable()
{
_levelScene.EnergyManager.EnergyChanged += OnEnergyChanged;
RefreshEnergy(false);
}
private void OnDisable()
{
_levelScene.EnergyManager.EnergyChanged -= OnEnergyChanged;
}
private void OnEnergyChanged()
{
RefreshEnergy();
}
private void RefreshEnergy(bool animate = true)
{
_energyText.text = $"{_levelScene.EnergyManager.CurrentEnergy}";
if (animate)
{
StopAllCoroutines();
StartCoroutine(AnimateChange());
}
}
private IEnumerator AnimateChange()
{
_energyText.transform.localScale = Vector3.one;
var zoomOutTime = 0f;
while (zoomOutTime <= _animationScaleDuration)
{
yield return new WaitForEndOfFrame();
zoomOutTime += Time.deltaTime;
var progress = Mathf.Clamp01(Mathf.InverseLerp(0, _animationScaleDuration, zoomOutTime));
_energyText.transform.localScale = (1 + progress * _animationExtraScale) * Vector3.one;
}
var zoomInTime = 0f;
while (zoomInTime <= _animationScaleDuration)
{
yield return new WaitForEndOfFrame();
zoomInTime += Time.deltaTime;
var progress = Mathf.Clamp01(Mathf.InverseLerp(0, _animationScaleDuration, zoomInTime));
_energyText.transform.localScale = (1 + _animationExtraScale - progress * _animationExtraScale) * Vector3.one;
}
_energyText.transform.localScale = Vector3.one;
}
}
}