TimerManager


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

public class TimerManager : MonoBehaviour 
{
	/// <summary>
	/// 全局实例
	/// </summary>
	private static TimerManager _Instance = null;
	
	/// <summary>
	/// 定时器字典
	/// </summary>
	private Dictionary<string, Timer> m_TimerList = new Dictionary<string, Timer>();
	
	/// <summary>
	///   增加队列
	/// </summary>
	private Dictionary<string, Timer> m_AddTimerList = new Dictionary<string, Timer>();
	
	/// <summary>
	///   销毁队列
	/// </summary>
	private List<string> m_DestroyTimerList = new List<string>();
	
	public delegate void TimerManagerHandler();
	
	public delegate void TimerManagerHandlerArgs(params object[] args);
	
	/// -----------------------------------------------------------------------------
	/// <summary>
	/// 全局实例
	/// </summary>
	/// -----------------------------------------------------------------------------
	public static TimerManager Instance
	{
		get
		{
			if (_Instance == null)
			{
				if (_Instance == null)
				{
					_Instance = FindObjectOfType(typeof(TimerManager)) as TimerManager;
				}
			}
			
			return _Instance;
		}
	}
	
	// Use this for initialization
	void Awake () 
	{
		if (TimerManager.Instance != null && TimerManager.Instance != this)
		{
			UnityEngine.Object.Destroy(this);
			return;
		}
		
		_Instance = this;
	}
	
	// Update is called once per frame
	void Update () 
	{
		if (m_DestroyTimerList.Count > 0)
		{
			///>从销毁队列中销毁指定内容
			foreach (string i in m_DestroyTimerList)
			{
				m_TimerList.Remove(i);
			}
			
			//清空
			m_DestroyTimerList.Clear();
		}
		
		if (m_AddTimerList.Count > 0)
		{
			///>从增加队列中增加定时器
			foreach (KeyValuePair<string, Timer> i in m_AddTimerList)
			{
				if (i.Value == null)
				{
					continue;
				}
				
				if (m_TimerList.ContainsKey(i.Key))
				{
					m_TimerList[i.Key] = i.Value;
				}
				else
				{
					m_TimerList.Add(i.Key, i.Value);
				}
			}
			
			//清空
			m_AddTimerList.Clear();
		}
		
		if (m_TimerList.Count > 0)
		{
			//响应定时器
			foreach (Timer timer in m_TimerList.Values)
			{
				if (timer == null)
				{
					return;
				}
				
				timer.Run();
			}
		}
	}
	
	/// -----------------------------------------------------------------------------
	/// <summary>
	/// 增加定时器
	/// </summary>
	/// <param name=""></param>
	/// <returns></returns>
	/// -----------------------------------------------------------------------------
	public bool AddTimer(string key, float duration, TimerManagerHandler handler)
	{
		return Internal_AddTimer(key, TIMER_MODE.NORMAL, duration, handler);
	}
	
	/// -----------------------------------------------------------------------------
	/// <summary>
	/// 增加持续定时器
	/// </summary>
	/// <param name=""></param>
	/// <returns></returns>
	/// -----------------------------------------------------------------------------
	public bool AddTimerRepeat(string key, float duration, TimerManagerHandler handler)
	{
		return Internal_AddTimer(key, TIMER_MODE.REPEAT, duration, handler);
	}
	
	public bool AddTimer(string key, float duration, TimerManagerHandlerArgs handler, params object[] args)
	{
		return Internal_AddTimer(key, TIMER_MODE.NORMAL, duration, handler, args);
	}
	
	public bool AddTimerRepeat(string key, float duration, TimerManagerHandlerArgs handler, params object[] args)
	{
		return Internal_AddTimer(key, TIMER_MODE.REPEAT, duration, handler, args);
	}

	/// <summary>
	/// 暂停带有前缀的所有定时器
	/// </summary>
	/// <param name="prefix"></param>
	public void BreakTimerWithPrefix(string prefix)
	{
		if (m_TimerList != null && m_TimerList.Count > 0)
		{
			string[] arr = new string[m_TimerList.Count];
			m_TimerList.Keys.CopyTo(arr, 0);
			
			for (int i = 0; i < arr.Length; i++)
			{
				if (arr[i].StartsWith(prefix))
				{
					BreakTimer(arr[i]);
				} 
			}
		}
	}

	/// <summary>
	/// 暂停计时器
	/// </summary>
	public void BreakTimer(string key)
	{
		if (!m_TimerList.ContainsKey(key))
		{
			return;
		}
		
		Timer timer = m_TimerList[key];
		timer.Break();
	}

	/// <summary>
	/// 重启带有前缀的所有定时器
	/// </summary>
	/// <param name="prefix"></param>
	public void ResumeTimerWithPrefix(string prefix)
	{
		if (m_TimerList != null && m_TimerList.Count > 0)
		{
			string[] arr = new string[m_TimerList.Count];
			m_TimerList.Keys.CopyTo(arr, 0);
			
			for (int i = 0; i < arr.Length; i++)
			{
				if (arr[i].StartsWith(prefix))
				{
					ResumeTimer(arr[i]);
				} 
			}
		}
	}
	
	
	/// <summary>
	/// 重启计时器
	/// </summary>
	public void ResumeTimer(string key)
	{
		if (!m_TimerList.ContainsKey(key))
		{
			return;
		}
		
		Timer timer = m_TimerList[key];
		timer.Resume();
	}

	/// <summary>
	/// 销毁带有前缀的所有定时器
	/// </summary>
	/// <param name="prefix"></param>
	public void ClearTimerWithPrefix(string prefix)
	{
		if (m_TimerList != null && m_TimerList.Count > 0)
		{
			foreach (string timerKey in m_TimerList.Keys)
			{
				if (timerKey.StartsWith(prefix))
				{
					Destroy(timerKey);
				} 
			}
		}
	}
	
	/// -----------------------------------------------------------------------------
	/// <summary>
	/// 销毁指定定时器
	/// </summary>
	/// <param name="key">标识符</param>
	/// <returns></returns>
	/// -----------------------------------------------------------------------------
	public bool Destroy(string key)
	{
		if (!m_TimerList.ContainsKey(key))
		{
			return false;
		}
		
		if (!m_DestroyTimerList.Contains(key))
		{
			m_DestroyTimerList.Add(key);
		}
		
		return true;
	}
	
	/// -----------------------------------------------------------------------------
	/// <summary>
	/// 增加定时器
	/// </summary>
	/// <param name=""></param>
	/// <returns></returns>
	/// -----------------------------------------------------------------------------
	private bool Internal_AddTimer(string key, TIMER_MODE mode, float duration, TimerManagerHandler handler)
	{
		if (string.IsNullOrEmpty(key))
		{
			return false;
		}
		
		if (duration < 0.0f)
		{
			return false;
		}
		
		Timer timer = new Timer(key, mode, Time.time, duration, handler, this);
		
		if (m_AddTimerList.ContainsKey(key))
		{
			m_AddTimerList[key] = timer;
		}
		else
		{
			m_AddTimerList.Add(key, timer);
		}
		
		return true;
	}
	
	private bool Internal_AddTimer(string key, TIMER_MODE mode, float duration, TimerManagerHandlerArgs handler, params object[] args)
	{
		if (string.IsNullOrEmpty(key))
		{
			return false;
		}
		
		if (duration < 0.0f)
		{
			return false;
		}
		
		Timer timer = new Timer(key, mode, Time.time, duration, handler, this, args);
		
		if (m_AddTimerList.ContainsKey(key))
		{
			m_AddTimerList[key] = timer;
		}
		else
		{
			m_AddTimerList.Add(key, timer);
		}
		
		return true;
	}
	
	public bool IsRunning(string key)
	{
		return m_TimerList.ContainsKey(key);
	}
	
	/// -----------------------------------------------------------------------------
	/// <summary>
	///  定时器模式
	/// </summary>
	/// -----------------------------------------------------------------------------
	private enum TIMER_MODE
	{
		NORMAL,
		REPEAT,
	}

	/// -----------------------------------------------------------------------------
	/// <summary>
	/// 获取指定定时器剩余时间
	/// </summary>
	/// <param name=""></param>
	/// <returns></returns>
	/// -----------------------------------------------------------------------------
	public float GetTimerLeft(string key)
	{
		if (!m_TimerList.ContainsKey(key))
		{
			return 0.0f;
		}
		
		Timer timer = m_TimerList[key];
		return timer.TimeLeft;
	}

	/// <summary>
	/// 获取带有前缀的定时器剩余时间
	/// </summary>
	/// <param name="prefix"></param>
	public float GetTimerLeftWithPrefix(string prefix)
	{
		if (m_TimerList != null && m_TimerList.Count > 0)
		{
			string[] arr = new string[m_TimerList.Count];
			m_TimerList.Keys.CopyTo(arr, 0);
			
			for (int i = 0; i < arr.Length; i++)
			{
				if (arr[i].StartsWith(prefix))
				{
					return GetTimerLeft(arr[i]);
				} 
			}
		}

		return 0.0f;
	}

	private class Timer
	{
		/// <summary>
		///   名称
		/// </summary>
		private string m_Name;
		
		/// <summary>
		///   模式
		/// </summary>
		private TIMER_MODE m_Mode;
		
		/// <summary>
		///   开始时间
		/// </summary>
		private float m_StartTime;
		
		/// <summary>
		///   时长
		/// </summary>
		private float m_duration;

		/// <summary>
		///  中断
		/// </summary>
		private bool m_Break = false;

		/// <summary>
		///  中断开始时间
		/// </summary>
		private float m_BreakStart;

		/// <summary>
		///  中断开始时间
		/// </summary>
		private float m_BreakDuration = 0;

		/// <summary>
		///   定时器委托
		/// </summary>
		private TimerManagerHandler m_TimerEvent;
		
		private TimerManagerHandlerArgs m_TimerArgsEvent;
		
		private TimerManager m_Manger;
		
		private object[] m_Args = null;
		
		/// -----------------------------------------------------------------------------
		/// <summary>
		/// 开始时间
		/// </summary>
		/// <param name=""></param>
		/// <returns></returns>
		/// -----------------------------------------------------------------------------
		public float StartTime
		{
			get
			{
				return m_StartTime;
			}
			set
			{
				m_StartTime = value;
			}
		}
		
		/// -----------------------------------------------------------------------------
		/// <summary>
		/// 剩余时间
		/// </summary>
		/// <param name=""></param>
		/// <returns></returns>
		/// -----------------------------------------------------------------------------
		public float TimeLeft
		{
			get
			{
				return Mathf.Max(0.0f, m_duration - (Time.time - m_StartTime) + m_BreakDuration);
			}
		}
		
		/// -----------------------------------------------------------------------------
		/// <summary>
		/// 
		/// </summary>
		/// <param name=""></param>
		/// <returns></returns>
		/// -----------------------------------------------------------------------------
		public Timer(string name, TIMER_MODE mode, float startTime, float duration, TimerManagerHandler handler, TimerManager manager)
		{
			m_Name = name;
			m_Mode = mode;
			m_StartTime = startTime;
			m_duration = duration;
			m_TimerEvent = handler;
			m_Manger = manager;
		}
		
		public Timer(string name, TIMER_MODE mode, float startTime, float duration, TimerManagerHandlerArgs handler, TimerManager manager, params object[] args)
		{
			m_Name = name;
			m_Mode = mode;
			m_StartTime = startTime;
			m_duration = duration;
			m_TimerArgsEvent = handler;
			m_Manger = manager;
			m_Args = args;
		}
		
		/// -----------------------------------------------------------------------------
		/// <summary>
		/// 运行事件
		/// </summary>
		/// <param name=""></param>
		/// <returns></returns>
		/// -----------------------------------------------------------------------------
		public void Run()
		{
			if (m_Break)
			{
				return;
			}

			if (this.TimeLeft > 0.0f)
			{
				return;
			}
			
			if (this.m_TimerEvent != null)
			{
				this.m_TimerEvent();
			}
			
			if (this.m_TimerArgsEvent != null)
			{
				this.m_TimerArgsEvent(m_Args);
			}
			
			if (m_Mode == TIMER_MODE.NORMAL)
			{
				m_Manger.Destroy(this.m_Name);
			}
			else
			{
				m_StartTime = Time.time;
				m_BreakDuration = 0;
			}
			return;
		}
		
		public void Break()
		{
			if (m_Break)
			{
				return;
			}

			m_Break = true;
			m_BreakStart = Time.time;
		}

		public void Resume()
		{
			if (!m_Break)
			{
				return;
			}

			m_BreakDuration += (Time.time - m_BreakStart);
			m_Break = false;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值