using UnityEngine; using UnityEngine.UI; using DG.Tweening; // DOTween public class ManaManager : MonoBehaviour { [Header("Mana")] public float maxMana = 100f; public float mana = 100f; [Header("Regen")] public bool enableRegen = true; public float regenPerSecond = 8f; public float regenDelayAfterSpend = 1.0f; [Header("UI")] public Image manaFillImage; // or assign an Image with fillAmount float regenResumeTime = 0f; void Awake() { mana = Mathf.Clamp(mana, 0, maxMana); InitUI(); } void Update() { if (!enableRegen) return; if (Time.time < regenResumeTime) return; if (mana >= maxMana) return; SetMana(Mathf.Min(maxMana, mana + regenPerSecond * Time.deltaTime)); } public bool Has(float amount) => mana >= amount; public bool Spend(float amount) { if (amount <= 0f) return true; if (mana < amount) return false; SetMana(mana - amount); regenResumeTime = Time.time + Mathf.Max(0f, regenDelayAfterSpend); return true; } public void Refill(float amount) { if (amount <= 0f) return; SetMana(Mathf.Min(maxMana, mana + amount)); } public void SetMax(float newMax, bool keepRatio = true) { newMax = Mathf.Max(1f, newMax); float ratio = maxMana > 0 ? mana / maxMana : 1f; maxMana = newMax; mana = keepRatio ? Mathf.Clamp01(ratio) * maxMana : Mathf.Min(mana, maxMana); InitUI(); } void SetMana(float newValue) { mana = newValue; UpdateUI(); } void InitUI() { if (manaFillImage) manaFillImage.fillAmount = mana / maxMana; } void UpdateUI() { if (manaFillImage) { manaFillImage.DOFillAmount(mana / maxMana, 0.25f).SetEase(Ease.OutCubic); } } // ===== Debug Menu ===== [ContextMenu("Debug/Spend 10 Mana")] void DebugSpend() => Spend(10f); [ContextMenu("Debug/Refill 10 Mana")] void DebugRefill() => Refill(10f); [ContextMenu("Debug/Empty Mana")] void DebugEmpty() => Spend(maxMana); }