93 lines
2.1 KiB
C#
Raw Normal View History

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);
}