项目需求,做了一个通用的血条,在这里记录一下
using UnityEngine;
using UnityEngine.UI;
namespace GCD.Ui
{
//加减血有缓动效果血条。
//如果没有加uiHpEff,就是普通血条
[AddComponentMenu("UI/XBlood")]
public class UiCommonBloodPanel : MonoBehaviour
{
[Space(10),Header("普通血条")]
public Image uiHpBar = null;
[SerializeField, Header("血条加血image")]
private Image uiAddImage = null;
[SerializeField, Header("血条减血image")]
private Image uiCutImage = null;
[SerializeField, Header("血条缓动效果")]
private Image uiHpEff = null;
[SerializeField, Header("血条缓动速度")]
private float Speed = 0.3f;
private float _tValue = 0; //当前血条值
private float _lastValue = 0; //上次血条值
private bool _isAddHp;
private bool _isCutHp;
/// <summary>
/// 血条初始化
/// </summary>
/// <param 当前血量="curhp"></param>
/// <param 最大血量="maxhp"></param>
public void Init(float curhp, float maxhp)
{
if (uiHpBar != null && maxhp > 0)
{
_tValue = curhp / maxhp;
uiHpBar.fillAmount = _tValue;
}
if (uiHpEff != null)
{
uiHpEff.fillAmount = _tValue;
}
if (uiAddImage != null && uiCutImage != null )
{
CTools.SetActive(uiAddImage, false);
CTools.SetActive(uiCutImage, false);
}
_isAddHp = false;
_isCutHp = false;
}
/// <summary>
/// 血条更新
/// </summary>
/// <param 当前血量="curhp"></param>
/// <param 最大血量="maxhp"></param>
public void OnSelfHpChange(float curhp, float maxhp)
{
_tValue = curhp / maxhp;
if (uiHpEff == null && uiHpBar!= null)
{
uiHpBar.fillAmount = _tValue; //如果没有挂缓动效果,直接加血
return;
}
if (uiCutImage == null || uiCutImage == null || uiHpEff == null) return;
if (_tValue > uiHpEff.fillAmount) //加血
{
_lastValue = uiHpEff.fillAmount;
_isAddHp = true; _isCutHp = false;
uiHpEff.sprite = uiAddImage.sprite;
uiHpEff.fillAmount = _tValue;
uiHpBar.fillAmount = _lastValue;
}
if (_tValue < uiHpBar.fillAmount)//减血
{
_lastValue = uiHpBar.fillAmount;
_isCutHp = true; _isAddHp = false;
uiHpEff.sprite = uiCutImage.sprite;
uiHpBar.fillAmount = _tValue;
uiHpEff.fillAmount = _lastValue;
}
}
void Update()
{
if (uiHpEff != null && uiHpBar != null && uiHpBar.fillAmount != uiHpEff.fillAmount )
{
if (uiHpBar.fillAmount < uiHpEff.fillAmount && _isAddHp)
{
uiHpBar.fillAmount += Speed * Time.deltaTime;
if (uiHpBar.fillAmount >= uiHpEff.fillAmount)
{
_isAddHp = false;
uiHpBar.fillAmount = uiHpEff.fillAmount;
}
}
if (uiHpBar.fillAmount < uiHpEff.fillAmount & _isCutHp)
{
uiHpEff.fillAmount -= Speed * Time.deltaTime;
if (uiHpEff.fillAmount <= uiHpBar.fillAmount)
{
_isCutHp = false;
uiHpEff.fillAmount = uiHpBar.fillAmount;
}
}
}
uiHpBar.color = Color.Lerp(Color.red, Color.green, uiHpBar.fillAmount);
}
public void Release()
{
_tValue = 0;
_isAddHp = false ;
_isCutHp = false ;
Speed = 0;
_lastValue = 0;
}
}
}