Unity实现简单技能冷却管理器

前言

这段时间做技能系统,需要实现技能冷却。如果每个技能都写一段计时器代码的话重复性太高而且还不方便管理,于是根据使用到的功能写了个简单的冷却管理器统一处理。

实现

代码很简单,理解思路即可。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;

public class CDMgr : MonoSingleton<CDMgr>  //这里继承的单例,可自己实现
{
    Dictionary<string, float> dic = new Dictionary<string, float>(); //保存id和cd时长信息
    Dictionary<string, float> cds = new Dictionary<string, float>(); //保存当前的cd
    List<string> ids = new List<string>(); //保存id

    void Update()
    {
        //冷却计时
        if (ids.Count > 0)
        {
            ids.ForEach(_ =>
            {
                if (cds[_] > 0)
                {
                    cds[_] -= Time.deltaTime;
                }
                else
                {
                    cds[_] = 0;
                }
            });
        }
    }

    //第一个参数传字符串也可,这里为了方便传参用的枚举
    //第二个参数为cd时长
    public void AddCD(string id, float time)
    {
        if (dic.ContainsKey(id))
        {
            Debug.LogError("该ID已存在!");
            return;
        }
        dic.Add(id, time);
        cds.Add(id, 0); //一开始没进入冷却
        ids.Add(id);
    }

    //进入冷却
    void StartCal(string id)
    {
        if (!dic.ContainsKey(id))
        {
            Debug.LogError("不存在该ID!");
            return;
        }

        cds[id] = dic[id];
    }

    //是否冷却结束,如果冷却结束会返回true并重新开始计算cd
    public bool IsReady(string id)
    {
        if (cds.ContainsKey(id))
        {
            if (cds[id] <= 0)
            {
                StartCal(id);
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            Debug.LogError("不存在该ID!");
            return false;
        }
    }

    //获取当前CD
    public float GetCurrentCD(string id)
    {
        if (cds.ContainsKey(id))
        {
            return cds[id];
        }
        else
        {
            Debug.LogError("不存在该ID!");
            return 9999999;
        }
    }

    //获取CD时长
    public float GetWholeCD(string id)
    {
        if (dic.ContainsKey(id))
        {
            return dic[id];
        }
        else
        {
            Debug.LogError("不存在该ID!");
            return 9999999;
        }
    }

    //移除id
    public void RemoveCD(string id)
    {
        if (dic.ContainsKey(id))
        {
            dic.Remove(id);
            cds.Remove(id);
            ids.Remove(id);
        }
        else
        {
            Debug.LogError("不存在该ID!");
        }
    }
}

使用

CDMgr脚本挂到场景中。
初始化时需要调用AddCD()注册进去。
判断冷却结束使用IsReady()即可。
如果不需要计时则使用RemoveCD()移除该计时,起到性能优化效果。
如果技能冷却中需要实现相关效果则可以通过GetCurrentCD()获取当前CD时长。
示例代码:

public class LaserAttackTri : MonoBehaviour
{
    public float CD = 0.5f;

    private void OnEnable()
    {
        CDMgr.Instance.AddCD("skill1", CD);
    }
    
    private void OnDisable()
    {
        CDMgr.Instance.RemoveCD("skill1");
    }

    private void OnTriggerEnter(Collider other)
    {
        if (CDMgr.Instance.IsReady("skill1"))
        {
            //技能
        }
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我寄人间雪满头丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值