一:目的异步
游戏开发中,计时是一个常见的功能。好比技能的冷却时间,角色的生命回复等等this
通常的实现方法是经过协程或者Invoke,可是这样并无统一管理全部的计时器,因此咱们须要一个管理器统一管理计时器的相关操做code
二:解决的问题及优势协程
——注册和注销计时器
——获得某一个计时器的倒计时剩余时间
——设置全部倒计时同步或异步游戏
三:使用方法图片
——使用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/ 网页游戏get