簡體   English   中英

添加額外的生命 HEART 紋理 2D

[英]Add extra life HEART texture 2D

我正在開發 2D 游戲。

當玩家與BOMBPrefab碰撞時失去 1 顆心(初始 3 顆心),如果碰撞 3 次 = GameOver。

這就是代碼(適用於 BombPrefab):

using UnityEngine;
using System.Collections;

public class Heart : MonoBehaviour {
  public Texture2D[] initialHeart;
  private int heart;
  private int many;

  // Use this for initialization
  void Start () {
    GetComponent<GUITexture>().texture = initialHeart[0];
    heart = initialHeart.Length;
  }

  // Update is called once per frame
  void Update () {}

  public bool TakeHeart()
  {
    if (heart < 0) {
      return false;
    }
    if (many < (heart - 1)) {
      many += 1;
      GetComponent<GUITexture> ().texture = initialHeart [many];
      return true;
    } else {
      return false;
    }
  }
}

我有第二個HeartPrefab ,我想檢查玩家何時發生碰撞......如果我有 3 顆心什么也不做,如果有 1 或 2 顆心 添加額外的心。

炸彈預制腳本:

   using UnityEngine;
using System.Collections;

public class Bomb : MonoBehaviour
{


    public AudioClip clipBomba;

    private Heart heart;
    private Gerenciador gerenciador;

    void Awake ()
    {


    }

    // Use this for initialization
    void Start ()
    {
        gerenciador = FindObjectOfType (typeof(Gerenciador)) as Gerenciador;
    }

    // Update is called once per frame
    void Update ()
    {



    }

    void OnCollisionEnter2D (Collision2D colisor)
    {
        if (colisor.gameObject.tag == "floor") {

            Destroy (gameObject, 2f);

        } else {

            if (colisor.gameObject.tag == "Bee") {

                Som();

                heart= GameObject.FindGameObjectWithTag ("Heart").GetComponent<Vidas> () as Vidas;

                if (heart.TakeHeart ()) {
                    Destroy (gameObject);

                } else {

                    gerenciador.GameOver ("GameOver");

                }
            }
        }
    }


    void Som()
    {

        GetComponent<AudioSource> ().clip = clipBomb;
        AudioSource.PlayClipAtPoint (clipBomb, transform.position);
    }
}

首先盡量不要在更新和經常運行的函數中使用GetComponent<>() 最好在Start()方法中緩存組件。 使用FindGameObjectWith...()也不是很有效。

我會用不同的方式,每個心臟作為一個單獨的 UI 元素(切換),有兩個狀態活動和非活動。 然后你的玩家應該有一個列表,列出那些允許受到傷害並獲得生命的心臟和方法。

int currentHeartsCount = 3;

int maxHeartsCount = 3;

List<Heart> hearts = new List<Heart>();

public void TakeDamage(int damage) {
    ChangeHearts(-damage);
} 

public void GainLife(int life) {
    ChangeHearts(life);   
}

private void ChangeHearts(int amount) {
    currentHeartsCount += amount;
    if(currentHeartsCount> maxHeartsCount)
        currentHeartsCount = maxHeartsCount;
    if(currentHeartsCount<=0) {
        // call player dead code
    }
    int i = 1;
    foreach(Heart heart in hearts) {
        heart.SetHeartActive(i<=currentHeartsCount);
        i++;
    }
}

這是一個簡化的解決方案,可以給您一個想法。 它比你的更強大,因為你可以很容易地改變開始的心數,並使像心“過度充電”這樣的東西。 只需添加基礎心,將最大值設置為所需值,現在您可以創建一些特殊的能量提升,增加心超過初始限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM