多重血条效果


描述:

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;                  //受到轻伤时(   
    /// 传入总血量,初始化血条  
    ///   
    ///   
    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 + "";
    }

    ///   
    /// 血量变化,并根据伤害判断是否使用过渡血条  
    ///   
    ///   
    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);
        }
    }

    /// 
    /// 普通血条的流动 
    /// 
    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();
    }

    /// 
    /// 过渡血条的流动  
    /// 
    void MoveMiddleBar()
    {
        //受到轻伤时( 
start中color颜色数组初始化时注意设置颜色的透明组,如果不初始化color数组,颜色值则全部为0,透明度为零。

参考链接 http://blog.csdn.net/lyh916/article/details/47038911

源码工程链接 链接点这里

你可能感兴趣的:(Unity3D,通用代码库)