2014-04-21 7 views
5

Sono nuovo di codifica e l'UnitàUnity 2D barra della salute

ho la barra della salute che appare sul mio schermo, ma non sono sicuro di come collegare la sceneggiatura Sanità della barra della salute per il mio script giocatore e il mio lettore di script di salute. Semplicemente, voglio fare in modo se il lettore viene colpito la mia barra di salute perderà un cuore

mio script barra della salute

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 <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<GUITexture>().pixelInset = new Rect(x * spacingX,y * spacingY,58,58); 
      newHeart.GetComponent<GUITexture>().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 >= 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 && currentHeartHealth > 0) { 
         imageIndex = 1; 
        } 

        heart.guiTexture.texture = heartImages[imageIndex]; 
        restAreEmpty = true; 
       } 
      } 

     } 
    } 
} 

mio script lettore

/// <summary> 
/// Player controller and behavior 
/// </summary> 
public class PlayerScript : MonoBehaviour 
{ 
    public Health health; 
    /// <summary> 
    /// 1 - The speed of the ship 
    /// </summary> 
    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<EnemyScript>(); 
     if (enemy != null) 
     { 
      // Kill the enemy 
      HealthScript enemyHealth = enemy.GetComponent<HealthScript>(); 
      if (enemyHealth != null) enemyHealth.Damage(enemyHealth.hp); 

      damagePlayer = true; 

     } 

     // Damage the player 
     if (damagePlayer) 
     { 
      HealthScript playerHealth = this.GetComponent<HealthScript>(); 
      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<WeaponScript>(); 
      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"); 
    } 

} 

e sceneggiatura salute di mia giocatore

using UnityEngine; 

/// <summary> 
/// Handle hitpoints and damages 
/// </summary> 
public class HealthScript : MonoBehaviour 
{ 
    /// <summary> 
    /// Total hitpoints 
    /// </summary> 
    public int hp = 1; 

    /// <summary> 
    /// Enemy or player? 
    /// </summary> 
    public bool isEnemy = true; 

    /// <summary> 
    /// Inflicts damage and check if the object should be destroyed 
    /// </summary> 
    /// <param name="damageCount"></param> 
    public void Damage(int damageCount) 
    { 
     hp -= damageCount; 

     if (hp <= 0) 
     { 
      // 'Splosion! 
      SpecialEffectsHelper.Instance.Explosion(transform.position); 

      // Dead! 
      Destroy(gameObject); 
     } 
    } 

    void OnTriggerEnter2D(Collider2D otherCollider) 
    { 
     // Is this a shot? 
     ShotScript shot = otherCollider.gameObject.GetComponent<ShotScript>(); 
     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 
      } 
     } 
    } 
} 

risposta

1

Nella tua PlayerScript si recupera il HealthScript ingegno h il seguente codice:

HealthScript playerHealth = this.GetComponent<HealthScript>(); 

Se si desidera chiamare metodi sullo script di salute si dovrebbe fare qualcosa di simile.

Health healthBar = this.GetComponent<Health>(); 
healthBar.modifyHealth(amountOfDamage); 

Ciò presuppone che tutti e 3 gli script si trovano sullo stesso oggetto di gioco.

3

Con il nuovo sistema di interfaccia utente in Unity 4.6 è davvero facile creare una barra della salute.

  • GameObject-> UI-> Immagine
  • Metti la tua barra della salute sprite in immagine.
  • Modificare il tipo di immagine su Riempito. Quindi puoi giocare con la proprietà Fill amount e anche controllare tramite il codice