using UnityEngine; /// /// Core player stats: health and stamina. /// Stamina drains while sprinting, regens when not. /// If stamina hits zero the player is exhausted and can't sprint again until it fully refills. /// public class Player : MonoBehaviour { [Header("Health")] public float maxHealth = 100f; public float health = 100f; [Header("Stamina")] public float maxStamina = 100f; public float stamina = 100f; public float staminaDrain = 22f; // per second while sprinting public float staminaRegen = 12f; // per second while not sprinting public float regenDelay = 1.2f; // seconds after stopping sprint before regen kicks in // ─── State ─────────────────────────────────────────────────────── [HideInInspector] public bool isSprinting = false; [HideInInspector] public bool isExhausted = false; // true until stamina fully refills private float _regenTimer = 0f; // ───────────────────────────────────────────────────────────────── void Update() { if (isSprinting && !isExhausted) { stamina -= staminaDrain * Time.deltaTime; _regenTimer = 0f; if (stamina <= 0f) { stamina = 0f; isExhausted = true; } } else { // Count down regen delay _regenTimer += Time.deltaTime; if (_regenTimer >= regenDelay) { stamina = Mathf.MoveTowards(stamina, maxStamina, staminaRegen * Time.deltaTime); // Clear exhaustion only once fully refilled if (isExhausted && stamina >= maxStamina) isExhausted = false; } } health = Mathf.Clamp(health, 0f, maxHealth); stamina = Mathf.Clamp(stamina, 0f, maxStamina); } // ─── Helpers other scripts can call ────────────────────────────── public bool CanSprint() => !isExhausted && stamina > 0f; public float HealthFraction => health / maxHealth; public float StaminaFraction => stamina / maxStamina; }