title: Unity 2D health bar
body: <p>I am new to coding and Unity</p>
  
  <p>I have the health bar appearing on my screen, but I am not sure how to link the Health script of the health bar to my player script and my player's health script. Simply, I want to make it so when my player gets shot my health bar will lose a heart</p>
  
  <p>my health bar script</p>
  
  <pre><code>using UnityEngine;
  using System.Collections;
  
  public class Health : MonoBehaviour {
  
      public int startHealth;
      public int healthPerHeart;
  
      private int maxHealth;
      private int currentHealth;
  
      public Texture[] heartImages;
      public GUITexture heartGUI;
  
      private ArrayList hearts = new ArrayList();
  
      // Spacing:
      public float maxHeartsOnRow;
      private float spacingX;
      private float spacingY;
  
  
      void Start () {
          spacingX = heartGUI.pixelInset.width;
          spacingY = -heartGUI.pixelInset.height;
  
          AddHearts(startHealth/healthPerHeart);
      }
  
      public void AddHearts(int n) {
          for (int i = 0; i &lt;n; i ++) { 
              Transform newHeart = ((GameObject)Instantiate(heartGUI.gameObject,this.transform.position,Quaternion.identity)).transform; // Creates a new heart
              newHeart.parent = transform;
  
              int y = (int)(Mathf.FloorToInt(hearts.Count / maxHeartsOnRow));
              int x = (int)(hearts.Count - y * maxHeartsOnRow);
  
              newHeart.GetComponent&lt;GUITexture&gt;().pixelInset = new Rect(x * spacingX,y * spacingY,58,58);
              newHeart.GetComponent&lt;GUITexture&gt;().texture = heartImages[0];
              hearts.Add(newHeart);
  
          }
          maxHealth += n * healthPerHeart;
          currentHealth = maxHealth;
          UpdateHearts();
      }
  
  
      public void modifyHealth(int amount) {
          currentHealth += amount;
          currentHealth = Mathf.Clamp(currentHealth,0,maxHealth);
          UpdateHearts();
      }
  
      void UpdateHearts() {
          bool restAreEmpty = false;
          int i =0;
  
          foreach (Transform heart in hearts) {
  
              if (restAreEmpty) {
                  heart.guiTexture.texture = heartImages[0]; // heart is empty
              }
              else {
                  i += 1; // current iteration
                  if (currentHealth &gt;= i * healthPerHeart) {
                      heart.guiTexture.texture = heartImages[heartImages.Length-1]; // health of current heart is full
                  }
                  else {
                      int currentHeartHealth = (int)(healthPerHeart - (healthPerHeart * i - currentHealth));
                      int healthPerImage = healthPerHeart / heartImages.Length; // how much health is there per image
                      int imageIndex = currentHeartHealth / healthPerImage;
  
  
                      if (imageIndex == 0 &amp;&amp; currentHeartHealth &gt; 0) {
                          imageIndex = 1;
                      }
  
                      heart.guiTexture.texture = heartImages[imageIndex];
                      restAreEmpty = true;
                  }
              }
  
          }
      }
  }
  </code></pre>
  
  <p>my player script</p>
  
  <pre><code>/// &lt;summary&gt;
  /// Player controller and behavior
  /// &lt;/summary&gt;
  public class PlayerScript : MonoBehaviour
  {
      public Health health;
      /// &lt;summary&gt;
      /// 1 - The speed of the ship
      /// &lt;/summary&gt;
      public Vector2 speed = new Vector2(50, 50);
  
      // 2 - Store the movement
      private Vector2 movement;
  
      void OnCollisionEnter2D(Collision2D collision)
      {
          bool damagePlayer = false;
  
          // Collision with enemy
          EnemyScript enemy = collision.gameObject.GetComponent&lt;EnemyScript&gt;();
          if (enemy != null)
          {
              // Kill the enemy
              HealthScript enemyHealth = enemy.GetComponent&lt;HealthScript&gt;();
              if (enemyHealth != null) enemyHealth.Damage(enemyHealth.hp);
  
              damagePlayer = true;
  
          }
  
          // Damage the player
          if (damagePlayer)
          {
              HealthScript playerHealth = this.GetComponent&lt;HealthScript&gt;();
              if (playerHealth != null) playerHealth.Damage(1);
  
          }
      }
  
  
  
      void Update()
      {
          // 3 - Retrieve axis information
          float inputX = Input.GetAxis("Horizontal");
          float inputY = Input.GetAxis("Vertical");
  
          // 4 - Movement per direction
          movement = new Vector2(
              speed.x * inputX,
              speed.y * inputY);
  
          // 5 - Shooting
          bool shoot = Input.GetButtonDown("Fire1");
          shoot |= Input.GetButtonDown("Fire2");
          // Careful: For Mac users, ctrl + arrow is a bad idea
  
          if (shoot)
          {
              WeaponScript weapon = GetComponent&lt;WeaponScript&gt;();
              if (weapon != null)
              {
                  // false because the player is not an enemy
                  weapon.Attack(false);
              }
          }
          // 6 - Make sure we are not outside the camera bounds
          var dist = (transform.position - Camera.main.transform.position).z;
  
          var leftBorder = Camera.main.ViewportToWorldPoint(
              new Vector3(0, 0, dist)
              ).x;
  
          var rightBorder = Camera.main.ViewportToWorldPoint(
              new Vector3(1, 0, dist)
              ).x;
  
          var topBorder = Camera.main.ViewportToWorldPoint(
              new Vector3(0, 0, dist)
              ).y;
  
          var bottomBorder = Camera.main.ViewportToWorldPoint(
              new Vector3(0, 1, dist)
              ).y;
  
          transform.position = new Vector3(
              Mathf.Clamp(transform.position.x, leftBorder, rightBorder),
              Mathf.Clamp(transform.position.y, topBorder, bottomBorder),
              transform.position.z
              );
  
      }
  
      void FixedUpdate()
      {
          // 5 - Move the game object
          rigidbody2D.velocity = movement;
      }
  
      void OnDestroy() 
      {
          Application.LoadLevel("gameOver"); 
      } 
  
  }
  </code></pre>
  
  <p>and my player's health script</p>
  
  <pre><code>using UnityEngine;
  
  /// &lt;summary&gt;
  /// Handle hitpoints and damages
  /// &lt;/summary&gt;
  public class HealthScript : MonoBehaviour
  {   
      /// &lt;summary&gt;
      /// Total hitpoints
      /// &lt;/summary&gt;
      public int hp = 1;
  
      /// &lt;summary&gt;
      /// Enemy or player?
      /// &lt;/summary&gt;
      public bool isEnemy = true;
  
      /// &lt;summary&gt;
      /// Inflicts damage and check if the object should be destroyed
      /// &lt;/summary&gt;
      /// &lt;param name="damageCount"&gt;&lt;/param&gt;
      public void Damage(int damageCount)
      {
          hp -= damageCount;
  
          if (hp &lt;= 0)
          {
              // 'Splosion!
              SpecialEffectsHelper.Instance.Explosion(transform.position);
  
              // Dead!
              Destroy(gameObject);
          }
      }
  
      void OnTriggerEnter2D(Collider2D otherCollider)
      {
          // Is this a shot?
          ShotScript shot = otherCollider.gameObject.GetComponent&lt;ShotScript&gt;();
          if (shot != null)
          {
              // Avoid friendly fire
              if (shot.isEnemyShot != isEnemy)
              {
                  Damage(shot.damage);
  
                  // Destroy the shot
                  Destroy(shot.gameObject); // Remember to always target the game object, otherwise you will just remove the script
              }
          }
      }
  }
  </code></pre>