Does anyone know how to make the healthbar stop at zero? (it currently goes below zero) Thank you.
- using UnityEngine;
- using System.Collections;
- using UnityEngine.UI;
-
- public class HealthBar : MonoBehaviour
- {
- #region FIELDS
-
- // The player's current health
- public int currentHealth;
-
- // The player's max health
- public int maxHealth;
-
- // The health bar's speed
- public float healthSpeed;
-
- // The health text
- public Text healthText;
-
- // The health's image, this is used for color changing
- public Image visualHealth;
-
- // The current xValue of the health
- private float currentValue;
-
- // How often can I take damage
- public float cooldown;
-
- // Indicates if we can take damage or not
- private bool onCD;
-
- // The healthbar's canvas
- public Canvas canvas;
-
- #endregion
-
- #region PROPERTIES
-
- // Property for accessing the player's health
- public int Health
- {
- get
- {
- return currentHealth;
- }
- set
- {
- currentHealth = value;
- }
- }
-
- #endregion
-
- // Use this for initialization
- void Start()
- {
- // Sets all start values
- onCD = false;
-
- //Sets the current health to the maxHealth
- currentHealth = maxHealth;
- }
-
- // Update is called once per frame
- void Update()
- {
- HandleHealthbar();
- if (Input.GetKeyDown(KeyCode.Space))
- {
- Health -= 10;
- }
- }
-
- // Handles the healthbar my moving it and changing color
- private void HandleHealthbar()
- {
- // Writes the current health in the text field
- healthText.text = "Health: " + currentHealth;
-
- // Maps the min and max position to the range between 0 and max health
- currentValue = Map( currentHealth, 0, maxHealth, 0, 1);
-
- // Sets the fillAmount of the health to simulate reduction of health
- visualHealth.fillAmount = Mathf.Lerp( visualHealth.fillAmount, currentValue, Time.deltaTime * healthSpeed );
-
- // If we have more than 50% health we use the green colors
- if ( currentHealth > maxHealth /2 )
- {
- visualHealth.color = new Color32( ( byte ) Map( currentHealth, maxHealth / 2, maxHealth, 255, 0 ), 255, 0, 255 );
- }
- // If we have less than 50% health we use the red colors
- else
- {
- visualHealth.color = new Color32( 255, ( byte ) Map ( currentHealth, 0, maxHealth / 2, 0, 255 ), 0, 255);
- }
- }
-
- void OnTriggerStay( Collider other )
- {
- // Used for simulating taking damage
- if ( other.tag == "Damage" )
- {
- if ( !onCD && currentHealth > 1 )
- {
- // Makes sure that we can't take damage right away
- StartCoroutine ( CoolDownDmg() );
- // Uses the Health Property so that we recolor and rescale the health when we change it
- Health -= 1;
- }
- }
-
- // Used for simulating gaining health
- if ( other.tag == "Health" )
- {
- if ( !onCD && currentHealth < maxHealth )
- {
- // Makes sure that we can't take damage right away
- StartCoroutine( CoolDownDmg() );
- // Uses the Health Property so that we can recolor and rescale the health when we change it
- Health += 1;
- }
- }
- }
-
- // Keeps track of the damage CD
- IEnumerator CoolDownDmg()
- {
- onCD = true;
- // Waits a while before we are able to take damage again
- yield return new WaitForSeconds( cooldown );
- onCD = false;
- }
-
- // This method maps a range of numbers into another range
- // <param name="x">The value to evaluate</param>
- // <param name="in_min">The minimum value of the evaluated variable</param>
- // <param name="in_max">The maximum value of the evaluated variable</param>
- // <param name="out_min">The minimum number we want to map to</param>
- // <param name="out_max">The maximum number we want to map to</param>
- // <returns></returns>
- public float Map(float x, float in_min, float in_max, float out_min, float out_max)
- {
- return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
- }
-
-
- }

Replies
If that doesn't work, then it is possible there could be another active script in your scene that is conflicting with this script, although it's unlikely since I'd imagine you would know about it.
once the currentHealth = 0, the fill keeps cycling (is there a way to stop the fill from continuously going down?)
I tried this:
The issue is once current health = 0 the fill amount stops in its tracks
(ie. does not reach 0 fill since it is going down over time)
Anyone know how to fix this?
http://docs.unity3d.com/ScriptReference/Mathf.Clamp.html