126 lines
3.6 KiB
C#
126 lines
3.6 KiB
C#
using UnityEngine;
|
|
using UnityEngine.UI; // Add this line to use Unity's UI components
|
|
|
|
public class StaminaSystem : MonoBehaviour
|
|
{
|
|
public float maxStamina;
|
|
public float currentStamina;
|
|
public float staminaRegenerationRate;
|
|
|
|
//public Text staminaText; // Reference to the UI Text component for displaying stamina
|
|
//public Slider staminaSlider; // Reference to the UI Slider component for visualizing stamina
|
|
public Image staminaCircle;
|
|
|
|
private bool isExhausted = false;
|
|
|
|
[SerializeField]
|
|
ParticleSystem lowStaminaVFX;
|
|
|
|
private void Start()
|
|
{
|
|
maxStamina = 100f;
|
|
staminaRegenerationRate = 0.1f;
|
|
currentStamina = maxStamina;
|
|
|
|
// Check if lowStaminaVFX is assigned
|
|
if (lowStaminaVFX == null)
|
|
{
|
|
DevLog.LogWarning("Low stamina VFX not assigned on " + gameObject.name);
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
// CompareTag avoids string allocation per frame (was gameObject.tag == "...")
|
|
if (gameObject.CompareTag("Player") && currentStamina < 99)
|
|
ReplenishStamina(0.1f);
|
|
if (gameObject.CompareTag("Enemy") && currentStamina < 99)
|
|
ReplenishStamina(0.015f);
|
|
|
|
// Check if lowStaminaVFX is assigned before using it
|
|
if (lowStaminaVFX != null)
|
|
{
|
|
if (currentStamina / maxStamina > 0.1 && lowStaminaVFX.isPlaying)
|
|
{
|
|
lowStaminaVFX.Stop();
|
|
}
|
|
}
|
|
|
|
if (!isExhausted)
|
|
{
|
|
UpdateStaminaUI(); // Update UI to reflect changes in stamina
|
|
}
|
|
}
|
|
|
|
public void UseStamina(float amount)
|
|
{
|
|
//print("stamina used in: " + gameObject.tag);
|
|
if (!isExhausted)
|
|
{
|
|
|
|
currentStamina -= amount;
|
|
|
|
//currentStamina = Mathf.Clamp(currentStamina, 0f, maxStamina);
|
|
|
|
if (currentStamina <= 0f)
|
|
{
|
|
currentStamina = 0;
|
|
isExhausted = true;
|
|
// Perform any actions when stamina is fully depleted (e.g., disable running)
|
|
//disable attacks
|
|
//disable running
|
|
}
|
|
|
|
// Check if lowStaminaVFX is assigned before using it
|
|
if (lowStaminaVFX != null)
|
|
{
|
|
if (currentStamina/maxStamina < 0.1)
|
|
{
|
|
lowStaminaVFX.Play();
|
|
}
|
|
else if(currentStamina/maxStamina > 0.1 && lowStaminaVFX.isPlaying)
|
|
{
|
|
lowStaminaVFX.Stop();
|
|
}
|
|
}
|
|
|
|
UpdateStaminaUI(); // Update UI to reflect changes in stamina
|
|
}
|
|
}
|
|
|
|
public void ReplenishStamina(float amount)
|
|
{
|
|
currentStamina += amount;
|
|
|
|
// Add a clamp to prevent stamina from exceeding maxStamina
|
|
currentStamina = Mathf.Clamp(currentStamina, 0f, maxStamina);
|
|
|
|
if (currentStamina > 0f)
|
|
{
|
|
isExhausted = false;
|
|
}
|
|
|
|
UpdateStaminaUI(); // Update UI to reflect changes in stamina
|
|
}
|
|
|
|
private void UpdateStaminaUI()
|
|
{
|
|
// Update the UI components to display the current stamina
|
|
// Add null check for staminaCircle
|
|
if (staminaCircle != null)
|
|
{
|
|
staminaCircle.fillAmount = currentStamina / maxStamina;
|
|
}
|
|
else
|
|
{
|
|
// Only log this once to avoid spamming the console
|
|
if (Time.frameCount % 300 == 0) // Log approximately every 5 seconds at 60 FPS
|
|
{
|
|
DevLog.LogWarning("Stamina circle reference is null on " + gameObject.name);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|