一:目标

游戏开发中,计时是一个常见的性能。比方技能的冷却工夫,角色的生命回复等等

个别的实现办法是通过协程或者Invoke,然而这样并没有对立治理所有的计时器,所以咱们须要一个管理器对立治理计时器的相干操作

二:解决的问题及长处

——注册和登记计时器
——失去某一个计时器的倒计时剩余时间
——设置所有倒计时同步或异步

三:应用办法

——应用TimerMgr.Ins.XXX

TimerMgr.Ins.RegisterTimer(3, () => {     Debug.Log("finish 1"); }, "", true);TimerMgr.Ins.RegisterTimer(4, () =>{    Debug.Log("finish 2");}, "", true);TimerMgr.Ins.UnRegisterAllTimer();TimerMgr.Ins.UnRegisterTimer("Timer1");TimerMgr.Ins.GetRemainTime("Timer1");

四:代码实现

using System.Collections.Generic;using UnityEngine;using System; /// <summary>/// 计时管理器/// </summary>public class TimerMgr : MonoSingleton<TimerMgr>{    //是否同步计时    private bool isSync = true;    public bool IsSync    {        get        {            return isSync;        }        set        {            isSync = value;        }    }     private List<TimerData> timerList = new List<TimerData>();//倒计时列表     private void Awake()    {        lastUpdateTime = Time.realtimeSinceStartup;    }     /// <summary>    /// 注册倒计时    /// </summary>    public void RegisterTimer(float countdown, Action onFinish = null, string timerName = "", bool ignoreTimeScale = false)    {        TimerData timerData = new TimerData(countdown, onFinish, timerName, ignoreTimeScale);        timerList.Add(timerData);    }     /// <summary>    /// 登记所有倒计时    /// </summary>    public void UnRegisterAllTimer()    {        timerList.Clear();    }    /// <summary>    /// 登记某一个倒计时    /// </summary>    public void UnRegisterTimer(string name)    {        List<TimerData> unRegisterCache = new List<TimerData>();        foreach (var timer in timerList)        {            if (timer.name == name)            {                unRegisterCache.Add(timer);            }        }         for (int i = unRegisterCache.Count - 1; i >= 0; i--)        {            timerList.RemoveAt(i);        }    }     /// <summary>    /// 失去倒计时剩余时间    /// </summary>    public float GetRemainTime(string name)    {        foreach (var timer in timerList)        {            if (timer.name == name)            {                return timer.Timer;            }        }        Debug.LogWarning("没有注册倒计时:" + name);        return -1;    }     float lastUpdateTime;//上一次的工夫    private void Update()    {        float realDeltaTime = Time.realtimeSinceStartup - lastUpdateTime;        lastUpdateTime = Time.realtimeSinceStartup;         if (isSync)        {            for (int i = 0; i < timerList.Count; i++)            {                timerList[i].UpdateTimer(timerList[i].ignoreTimeScale ? realDeltaTime : Time.deltaTime);                if (timerList[i].isFinish)                {                    timerList.Remove(timerList[i]);                    i--;                }            }        }        else        {            if (timerList.Count == 0) return;             timerList[0].UpdateTimer(timerList[0].ignoreTimeScale ? realDeltaTime : Time.deltaTime);            if (timerList[0].isFinish)            {                timerList.Remove(timerList[0]);            }        }    }} /// <summary>/// 计时器的数据类/// </summary>public class TimerData{    //计时器    private float timer;    public float Timer    {        get        {            return timer;        }    }     public float countdown;//倒计时工夫    public string name;//倒计时的名称    public bool ignoreTimeScale;//是否疏忽工夫比例    public Action onFinish;//倒计时完结的回调    public bool isFinish;//是否实现倒计时     /// <summary>    /// 初始化计时器    /// </summary>    public TimerData(float countdown, Action onFinish, string name, bool ignoreTimeScale)    {        timer = countdown;        this.countdown = countdown;        this.onFinish = onFinish;        this.name = name;        this.ignoreTimeScale = ignoreTimeScale;    }     /// <summary>    /// 更新倒计时    /// </summary>    public void UpdateTimer(float deltaTime)    {        timer -= deltaTime;        if (timer <= 0)        {            isFinish = true;            onFinish?.Invoke();        }    }}

图片起源:http://www.coubai.com/ 网页游戏