unity 实现血条缓降的静态方法

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,对象当前生命值,对象最大生命值,缓降时间)设置好这些就可以直接实现血条的缓降效果。

跟我第一篇文章一样 本身并不难只是想让每个有需要的萌新可以更方便的实现一些功能 可能有很多插件有这个微不足道的功能 但我希望如果看到我这篇文章 可以让每个人能理解其中是怎么实现的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值