Files
OTG_6/Assets/_Scripts/UI/ResourceBarUI.cs
T
2026-06-04 21:37:43 +03:00

90 lines
2.2 KiB
C#

using OTG.Lab06.Characters;
using UnityEngine;
using UnityEngine.UI;
namespace OTG.Lab06.UI
{
public sealed class ResourceBarUI : MonoBehaviour
{
[SerializeField] private PlayerStats playerStats;
[SerializeField] private Image fill;
[SerializeField] private Text valueLabel;
[SerializeField] private bool useMana;
private void OnEnable()
{
Subscribe();
Refresh();
}
private void OnDisable()
{
Unsubscribe();
}
public void Bind(PlayerStats stats, bool mana)
{
Unsubscribe();
playerStats = stats;
useMana = mana;
Subscribe();
Refresh();
}
private void Subscribe()
{
if (playerStats == null)
{
return;
}
if (useMana)
{
playerStats.ManaChanged += OnChanged;
}
else
{
playerStats.HealthChanged += OnChanged;
}
}
private void Unsubscribe()
{
if (playerStats == null)
{
return;
}
playerStats.ManaChanged -= OnChanged;
playerStats.HealthChanged -= OnChanged;
}
private void Refresh()
{
if (playerStats == null)
{
return;
}
OnChanged(useMana ? playerStats.Mana : playerStats.Health, useMana ? playerStats.MaxMana : playerStats.MaxHealth);
}
private void OnChanged(float current, float max)
{
float normalized = max <= 0f ? 0f : Mathf.Clamp01(current / max);
if (fill != null)
{
fill.type = Image.Type.Filled;
fill.fillMethod = Image.FillMethod.Horizontal;
fill.fillOrigin = (int)Image.OriginHorizontal.Left;
fill.fillAmount = normalized;
}
if (valueLabel != null)
{
valueLabel.text = $"{Mathf.RoundToInt(current)} / {Mathf.RoundToInt(max)}";
}
}
}
}