PlayerStats.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using StarterAssets;
  4. public class PlayerStats : MonoBehaviour
  5. {
  6. [Header("Health Settings")]
  7. public float maxHealth = 100f;
  8. public float currentHealth;
  9. public Image healthFillImage;
  10. [Header("Stamina Settings")]
  11. public float maxStamina = 100f;
  12. public float currentStamina;
  13. public float drainRate = 25f;
  14. public float regenRate = 15f;
  15. public Image staminaFillImage;
  16. [Header("Movement Overrides")]
  17. public float walkSpeed = 6f;
  18. public float sprintSpeed = 12f;
  19. public float jumpHeight = 3f;
  20. private ThirdPersonController _controller;
  21. private StarterAssetsInputs _inputs;
  22. void Start()
  23. {
  24. currentHealth = maxHealth;
  25. currentStamina = maxStamina;
  26. _controller = GetComponent<ThirdPersonController>();
  27. _inputs = GetComponent<StarterAssetsInputs>();
  28. if (_controller != null)
  29. {
  30. _controller.JumpHeight = jumpHeight;
  31. }
  32. }
  33. void Update()
  34. {
  35. HandleStamina();
  36. UpdateUI();
  37. }
  38. void HandleStamina()
  39. {
  40. bool isMoving = _inputs.move != Vector2.zero;
  41. // 1. If we are OUT of stamina, force the sprint input to FALSE
  42. if (currentStamina <= 0)
  43. {
  44. _inputs.sprint = false;
  45. }
  46. // 2. Check if we are currently sprinting (Must have stamina AND be holding shift)
  47. if (_inputs.sprint && isMoving && currentStamina > 0)
  48. {
  49. currentStamina -= drainRate * Time.deltaTime;
  50. // Ensure the controller speeds are set (in case they got changed)
  51. _controller.SprintSpeed = sprintSpeed;
  52. }
  53. else
  54. {
  55. // 3. Regen stamina if not sprinting
  56. if (currentStamina < maxStamina)
  57. {
  58. currentStamina += regenRate * Time.deltaTime;
  59. }
  60. // Safety: Ensure walk speed is correct
  61. _controller.MoveSpeed = walkSpeed;
  62. }
  63. // Keep stamina in bounds
  64. currentStamina = Mathf.Clamp(currentStamina, 0, maxStamina);
  65. }
  66. public void TakeDamage(float amount)
  67. {
  68. currentHealth -= amount;
  69. if (currentHealth <= 0)
  70. {
  71. currentHealth = 0;
  72. // Prevent multiple game over triggers
  73. if (GameManager.Instance != null) GameManager.Instance.GameOver(false);
  74. }
  75. }
  76. void UpdateUI()
  77. {
  78. if (healthFillImage != null) healthFillImage.fillAmount = currentHealth / maxHealth;
  79. if (staminaFillImage != null) staminaFillImage.fillAmount = currentStamina / maxStamina;
  80. }
  81. }