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スクリプトをシーンにぶら下げます初期化中に登録
を呼び出す必要があります。冷却が終わったと判断した場合に使用できますタイミングが不要な場合は、を使用してタイミングを削除し、パフォーマンスを最適化します。スキルの冷却中に関連する効果を達成する必要がある場合は、現在のCD期間を取得できます。サンプルコード:AddCD()
IsReady()
RemoveCD()
GetCurrentCD()

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"))
        {
    
    
            //技能
        }
    }
}

おすすめ

転載: blog.csdn.net/qq_39162826/article/details/120362166
おすすめ