描述:
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
源碼工程鏈接 鏈接點這裏