Unity的TimeManager定时任务类

定时任务类

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

public delegate void TimeTaskDelegate();

/// <summary>
/// 定时任务类
/// </summary>
public class TimeTask
{
    /// <summary>  
    /// 延迟时间  
    /// </summary>  
    private float _timeDelay;
    /// <summary>  
    /// 延迟时间  
    /// </summary>  
    private float _timeDelayOnly;
    /// <summary>  
    /// 是否需要重复执行  
    /// </summary>  
    private bool _repeat;
    /// <summary>
    /// 重复次数
    /// </summary>
    private int _repeatCount = -1;
    /// <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 int repeatCount { 
        get => _repeatCount; 
        set => _repeatCount = value; }

    //构造函数  
    public TimeTask(float timeDelay, bool repeat, int repeatCount, TimeTaskDelegate timeTaskCallBack)
    {
        _timeDelay = timeDelay;
        _timeDelayOnly = timeDelay;
        _repeat = repeat;
        _repeatCount = repeatCount;
        _timeTaskCallBack = timeTaskCallBack;
    }

    public TimeTask(float timeDelay, bool repeat, TimeTaskDelegate timeTaskCallBack) : this(timeDelay, repeat, -1, timeTaskCallBack) { }

    public TimeTask(float timeDelay, TimeTaskDelegate timeTaskCallBack) : this(timeDelay, false, 0, timeTaskCallBack) { }
}



定时任务模块

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

/// <summary>
/// 定时任务模块
/// </summary>
public class TimeManager : SingletonAutoMono<TimeManager>
{
    /// <summary>  
    /// 定时任务列表  
    /// </summary>  
    private List<TimeTask> taskList = new List<TimeTask>();

    private void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }

    /// <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(float timeDelay, bool repeat, int repeatCount, TimeTaskDelegate timeTaskCallback)
    {
        AddTask(new TimeTask(timeDelay, repeat, repeatCount, 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.repeat && task.repeatCount != -1)
                {
                    task.repeatCount--;
                    if (task.repeatCount < 0)
                    {
                        taskList.Remove(task);
                        continue;
                    }
                }
                if (task.timeTaskCallBack != null)
                {
                    task.timeTaskCallBack();
                }
                if (!task.repeat)
                {
                    taskList.Remove(task);
                    continue;
                }    
                task.timeDelay = task.timeDelayOnly;
            }
            i++;
        }
    }

}

posted @ 2022-03-30 11:29  Excel2016  阅读(240)  评论(0)    收藏  举报