using UnityEngine; using UnityEngine.UI; /// /// Manages the health bar UI for the player. /// Attach to the health bar fill image in the UI. /// public class HealthBarController : MonoBehaviour { [Header("Health Bar")] [Tooltip("The fill image that shows current health")] public Image healthBarFill; [Tooltip("Background image behind the health bar")] public Image healthBarBackground; [Tooltip("Text showing current HP numbers")] public Text healthText; [Header("Colors")] [Tooltip("Color when health is high")] public Color healthyColor = Color.green; [Tooltip("Color when health is medium")] public Color mediumColor = Color.yellow; [Tooltip("Color when health is low")] public Color lowColor = Color.red; [Header("Damage Effect")] [Tooltip("Flash white when taking damage")] public bool flashOnDamage = true; [Tooltip("Duration of damage flash")] public float flashDuration = 0.2f; private float currentHealthPercent; private float flashTimer; private bool isFlashing; void Start() { // Setup colors if (healthBarFill != null) { healthBarFill.color = healthyColor; } // Set initial text UpdateHealthText(100); } void Update() { HandleDamageFlash(); } /// /// Update the health bar based on health percentage (0 to 1). /// public void UpdateHealthBar(float healthPercent) { currentHealthPercent = Mathf.Clamp01(healthPercent); if (healthBarFill != null) { healthBarFill.fillAmount = currentHealthPercent; // Update color based on health if (!isFlashing) { if (currentHealthPercent > 0.5f) { healthBarFill.color = Color.Lerp(lowColor, healthyColor, (currentHealthPercent - 0.5f) * 2f); } else { healthBarFill.color = Color.Lerp(lowColor, mediumColor, currentHealthPercent * 2f); } } } // Update text if (healthText != null) { int currentHP = Mathf.RoundToInt(currentHealthPercent * 100); UpdateHealthText(currentHP); } } void UpdateHealthText(int hp) { if (healthText != null) { healthText.text = $"HP: {hp}"; } } /// /// Trigger a damage flash effect. /// public void TriggerDamageFlash() { if (flashOnDamage) { isFlashing = true; flashTimer = flashDuration; if (healthBarFill != null) { healthBarFill.color = Color.white; } } } void HandleDamageFlash() { if (isFlashing) { flashTimer -= Time.deltaTime; if (flashTimer <= 0) { isFlashing = false; UpdateHealthBar(currentHealthPercent); } } } }