using System.Collections;
using UnityEngine;
using UnityEngine.UI;
public class HealthBarStaticClass : MonoBehaviour
{
// 单例实例
private static HealthBarStaticClass _instance;
// 获取单例实例
public static HealthBarStaticClass Instance
{
get
{
if (_instance == null)
{
GameObject obj = new GameObject("HealthBarStaticClass");
_instance = obj.AddComponent<HealthBarStaticClass>();
}
return _instance;
}
}
private Coroutine updateCoroutine;
// 静态方法
public static void HealthBarUpdate(Image hpImg, Image hpEffectImg, float currentHealth, float maxHealth, float buffTime)
{
Instance.HealthBarUpdateInstance(hpImg, hpEffectImg, currentHealth, maxHealth, buffTime);
}
// 实例方法,用于启动协程
private void HealthBarUpdateInstance(Image hpImg, Image hpEffectImg, float currentHealth, float maxHealth, float buffTime)
{
hpImg.fillAmount = currentHealth / maxHealth;
// 如果已经有协程在运行,则停止它
if (updateCoroutine != null)
{
StopCoroutine(updateCoroutine);
}
// 启动新的协程
updateCoroutine = StartCoroutine(UpdateBar(hpImg, hpEffectImg, buffTime));
}
// 协程,用于实现血条渐变效果
private IEnumerator UpdateBar(Image hpImg, Image hpEffectImg, float buffTime)
{
float effectLength = hpEffectImg.fillAmount - hpImg.fillAmount;
float elapsedTime = 0f;
while (elapsedTime < buffTime && effectLength != 0)
{
elapsedTime += Time.deltaTime;
hpEffectImg.fillAmount = Mathf.Lerp(hpImg.fillAmount + effectLength, hpImg.fillAmount, elapsedTime / buffTime);
yield return null;
}
// 确保最终值一致
hpEffectImg.fillAmount = hpImg.fillAmount;
}
}
调用示例:
public Image HpImg;
public Image HpEffectImg;
public float maxHealth;
public float currentHealth;
public float buffTime = 0.45f;
private void Update()
{
//放到update里执行
HealthBarStaticClass.HealthBarUpdate(HpImg,HpEffectImg,currentHealth,maxHealth,buffTime);
}
这个文件里的静态方法在全局调用时只需要填上相应的参数即可 参数从左到右依次是(血条Img,缓降条Img,对象当前生命值,对象最大生命值,缓降时间)设置好这些就可以直接实现血条的缓降效果。
跟我第一篇文章一样 本身并不难只是想让每个有需要的萌新可以更方便的实现一些功能 可能有很多插件有这个微不足道的功能 但我希望如果看到我这篇文章 可以让每个人能理解其中是怎么实现的.
1837

被折叠的 条评论
为什么被折叠?



