unity3d:定時任務封裝類TimeManager
阿新 • • 發佈:2018-12-11
namespace Framework.Tools { /// <summary> /// 定時任務封裝類 /// </summary> public class TimeTask { /// <summary> /// 延遲時間 /// </summary> private float _timeDelay; /// <summary> /// 延遲時間 /// </summary> private float _timeDelayOnly; /// <summary> /// 是否需要重複執行 /// </summary> private bool _repeat; /// <summary> /// 回撥函式 /// </summary> private TimeTaskDelegate _timeTaskCallBack; public float timeDelay { get { return _timeDelay; } set { _timeDelay = value; } } public float timeDelayOnly { get { return _timeDelayOnly; } } public bool repeat { get { return _repeat; } set { _repeat = value; } } public TimeTaskDelegate timeTaskCallBack { get { return _timeTaskCallBack; } } //建構函式 public TimeTask(float timeDelay, bool repeat, TimeTaskDelegate timeTaskCallBack) { _timeDelay = timeDelay; _timeDelayOnly = timeDelay; _repeat = repeat; _timeTaskCallBack = timeTaskCallBack; } public TimeTask(float timeDelay, TimeTaskDelegate timeTaskCallBack) : this(timeDelay, true, timeTaskCallBack) { } } }
using System.Collections.Generic; using UnityEngine; using Framework.Pattern; namespace Framework.Tools { public delegate void TimeTaskDelegate(); /// <summary> /// 定時工作管理員 /// </summary> public class TimeManager : SingletonMono<TimeManager> { /// <summary> /// 定時任務列表 /// </summary> private List<TimeTask> taskList = new List<TimeTask>(); /// <summary> /// 新增定時任務 /// </summary> /// <param name="timeDelay">延時執行時間間隔</param> /// <param name="repeat">是否可以重複執行</param> /// <param name="timeTaskCallback">執行回撥</param> public void AddTask(float timeDelay, bool repeat, TimeTaskDelegate timeTaskCallback) { AddTask(new TimeTask(timeDelay, repeat, timeTaskCallback)); } public void AddTask(TimeTask taskToAdd) { if (taskList.Contains(taskToAdd) || taskToAdd == null) return; taskList.Add(taskToAdd); } /// <summary> /// 移除定時任務 /// </summary> /// <param name="taskToRemove"></param> /// <returns></returns> public bool RemoveTask(TimeTaskDelegate taskToRemove) { if (taskList.Count == 0 || taskToRemove == null) return false; for (var i = 0; i < taskList.Count; i++) { TimeTask item = taskList[i]; if (item.timeTaskCallBack == taskToRemove) return taskList.Remove(item); } return false; } void Update() { Tick(); } /// <summary> /// 執行定時任務 /// </summary> private void Tick() { if (taskList == null) return; for (var i = 0; i < taskList.Count;) { TimeTask task = taskList[i]; task.timeDelay -= Time.deltaTime; if (task.timeDelay <= 0) { if (task.timeTaskCallBack != null) { task.timeTaskCallBack(); } if (!task.repeat) { taskList.Remove(task); continue; } task.timeDelay = task.timeDelayOnly; } i++; } } } }