多重血條效果


描述:

1.當受到傷害較小時,出現“殘血”效果

2.當受到傷害較大時,出現“流水”效果

血條由4部分組成

1.剩餘學條數

2.當前血條剩餘血量image

3.過度血條image

4.下一血條顯示顏色 image

注意:這裏的血條顯示image 需要將Image.Type設置爲Filled,fill Method設置爲水平,


using UnityEngine;
using System.Collections;
using UnityEngine.UI;

//如果只有一條血,那麼一條血就是所有的血量
//如果有多條血,那麼一條血就設定爲一個固定值
public class MultiplyBloodBar : MonoBehaviour
{

    public Image nowBar;                            //當前血條
    public Image middleBar;                         //過渡血條
    public Image nextBar;                           //下一血條
    public Text countText;                          //剩下的血條數text

    private int count;                              //剩下的血條數(不包括當前血量)
    private float nowBlood;                         //在一條血中的當前血量,如:100/1000則爲100  
    private float oneBarBlood = 10000f;             //一條血的容量,如:100/1000則爲1000     

    private int colorIndex = 0;
    public Color[] colors;                          //血條的顏色,注意Alpha值,默認爲0

    private float slowSpeed = 0.1f;                 //受到重傷時( >oneBarBlood)或者處於加血狀態,當前血條的流動速度  
    private float quickSpeed = 1f;                  //受到輕傷時( <oneBarBlood),當前血條的流動速度  
    private float speed;                            //當前血條採用的速度  
    private float middleBarSpeed = 0.1f;            //過渡血條的流動速度  

    private float nowTargetValue;                   //當前血條移動的目標點 
    private float middleTargetValue;                //過渡血條移動的目標點 
    private bool isBloodMove = false;               //控制血條的移動  

    void Update()
    {
        MoveNowBar();                               //當前血條的流動 
        MoveMiddleBar();                            //過渡血條的流動  
        if (Input.GetMouseButtonDown(0))
        {
            ChangeBlood(-3000);
        }
        else if (Input.GetMouseButtonDown(1))
        {
            ChangeBlood(-15000);
        }
    }
    private void Awake()
    {

    }
    private void Start()
    {
        colors = new Color[] { new Color(1, 0, 0, 1), new Color(0, 1, 0, 1), new Color(0,0,1,1) };
        InitBlood(100000);

    }
    /// <summary>  
    /// 傳入總血量,初始化血條  
    /// </summary>  
    /// <param name="number"></param>  
    public void InitBlood(float number)
    {
        count = (int)(number / oneBarBlood);//剩下的血條數
        nowBlood = number % oneBarBlood;//最後一條血的當前血量
        if (nowBlood == 0)  //如果最後一條血的血量剛好充滿剩餘血條數減一
        {
            nowBlood = oneBarBlood;
            count--;            
        }

        colorIndex = count % colors.Length;
        nowBar.color = colors[colorIndex];
        nowBar.fillAmount = nowBlood / oneBarBlood;

        if (count != 0)
        {
            int nextColorIndex = (colorIndex - 1 + colors.Length) % colors.Length;
            nextBar.color = colors[nextColorIndex];
            nextBar.gameObject.SetActive(true);
        }
        else
        {
            nextBar.gameObject.SetActive(false);
        }

        middleBar.gameObject.SetActive(false);

        countText.text = count + "";
    }

    /// <summary>  
    /// 血量變化,並根據傷害判斷是否使用過渡血條  
    /// </summary>  
    /// <param name="number"></param>  
    public void ChangeBlood(float number)
    {
        nowBlood += number;
        nowTargetValue = nowBlood / oneBarBlood;
        isBloodMove = true;

        if ((number < 0) && (Mathf.Abs(number) <= oneBarBlood))//處於受傷狀態並且傷害量較低時  
        {
            speed = quickSpeed;
            middleBar.gameObject.SetActive(true);
            middleBar.transform.SetSiblingIndex(nextBar.transform.GetSiblingIndex() + 1);
            middleBar.fillAmount = nowBar.fillAmount;
            middleTargetValue = nowTargetValue;
        }
        else//處於受傷狀態並且傷害量較大時,或者處於加血狀態  
        {
            speed = slowSpeed;
            middleBar.gameObject.SetActive(false);
        }
    }

    /// <summary>
    /// 普通血條的流動 
    /// </summary>
    void MoveNowBar()
    {
        if (!isBloodMove) return;
                    
        nowBar.fillAmount = Mathf.Lerp(nowBar.fillAmount, nowTargetValue, speed);

        if (Mathf.Abs(nowBar.fillAmount - nowTargetValue) <= 0.01f)//到達目標點  
            isBloodMove = false;

        if (count == 0)
            nextBar.gameObject.SetActive(false);
        else
            nextBar.gameObject.SetActive(true);

        if (nowBar.fillAmount >= nowTargetValue)
            SubBlood();
        else
            AddBlood();
    }

    /// <summary>
    /// 過渡血條的流動  
    /// </summary>
    void MoveMiddleBar()
    {
        //受到輕傷時( <oneBarBlood),纔會出現過渡血條
        if (speed == quickSpeed)
        {
            middleBar.fillAmount = Mathf.Lerp(middleBar.fillAmount, middleTargetValue, middleBarSpeed);
            if (Mathf.Abs(middleBar.fillAmount - 0) < 0.01f)
            {
                middleBar.transform.SetSiblingIndex(nextBar.transform.GetSiblingIndex() + 1);
                middleBar.fillAmount = 1;
                middleTargetValue++;
            }
        }
    }

    void AddBlood()
    {
        float subValue = Mathf.Abs(nowBar.fillAmount - 1);
        if (subValue <= 0.0f)//到達1  
        {
            count++;
            countText.text = count.ToString();

            nowBar.fillAmount = 0;
            nowTargetValue -= 1;
            nowBlood -= oneBarBlood;

            nextBar.color = colors[colorIndex];

            colorIndex++;
            colorIndex %= colors.Length;
            nowBar.color = colors[colorIndex];
        }
    }

    void SubBlood()
    {
        float subValue = Mathf.Abs(nowBar.fillAmount - 0);
        if (subValue <= 0.0f)//到達0  
        {
            //當前血條已經流動完,將過渡血條放置最前
            middleBar.transform.SetSiblingIndex(nextBar.transform.GetSiblingIndex() + 2);

            if (count <= 0)
            {
                middleBar.gameObject.SetActive(false);
                Destroy(this);
                return;
            };
            count--;
            countText.text = count.ToString();

            nowBar.fillAmount = 1;
            nowTargetValue += 1;
            nowBlood += oneBarBlood;

            colorIndex--;
            colorIndex += colors.Length;
            colorIndex %= colors.Length;
            nowBar.color = colors[colorIndex];

            int nextColorIndex = colorIndex - 1 + colors.Length;
            nextColorIndex %= colors.Length;
            nextBar.color = colors[nextColorIndex];
        }
    }

}
start中color顏色數組初始化時注意設置顏色的透明組,如果不初始化color數組,顏色值則全部爲0,透明度爲零。

參考鏈接 http://blog.csdn.net/lyh916/article/details/47038911

源碼工程鏈接 鏈接點這裏

發佈了33 篇原創文章 · 獲贊 9 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章