计时器任务管理

在实际游戏开发过程中经常会用到计时器,例如在多少秒以后执行某个任务,游戏中各种弹窗的消失等等事件。

每当我们需要用到计时器的时候就去写一个,这样子等工程庞大的时候,非常不利于管理。为了方便管理,

我们可以把所有的计时任务统一管理起来。

首先 我们需要一个全局的计时任务管理类:

public class TimerTaskManager : MonoBehaviour
{
   
    private List<TimerTask> taskList = new List<TimerTask>();

    private static TimerTaskManager _instance;
    public static TimerTaskManager Instance
    {
        get
        {
            return _instance;
        }
    }

    private void Awake()
    {
        _instance = this;
    }

    public void AddTimeTask(float delayTime,bool repeat,TimeTaskDelegate timeCallBack)
    {
        TimerTask timeTask = new TimerTask(delayTime, repeat, timeCallBack);
        if (taskList.Contains(timeTask) || timeTask == null)
            return;
        taskList.Add(timeTask);
    }

    public void RemoveTask(TimeTaskDelegate timeTask)
    {
        if (taskList.Count == 0 || timeTask == null)
            return;
     
        for (int i = 0; i < taskList.Count; i++)
        {
            if (taskList[i].TimeTaskCallBack==timeTask)
            {
                taskList.Remove(taskList[i]);
                i--;
            }
        }

    }

    private void Update()
    {
        //驱动每一帧去检测
        Tick();
    }

    /// <summary>
    /// 检测定时任务是否达到执行要求
    /// </summary>
    private void Tick()
    {
        if (taskList == null)
            return;       
        for (int i = 0; i < taskList.Count; i++)
        {
            taskList[i].TimeDelay -= Time.deltaTime;
            if (taskList[i].TimeDelay<=0)
            {
                taskList[i].TimeTaskCallBack();
                taskList[i].TimeDelay = taskList[i].TimeDelayOnly;
                if (!taskList[i].IsRepeat)
                {
                    taskList.Remove(taskList[i]);
                    i--;
                }
            }
           
        }

    }



}

该类有一个存放待执行任务的list,可以添加任务,和取消某任务。

还需要声明一个 计时任务的委托。

public delegate void TimeTaskDelegate();

接下来是任务类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 定时任务类
/// </summary>
public class TimerTask
{
    //延迟时间
    public float TimeDelay { set; get; }
	//和延迟时间一样
    public float TimeDelayOnly { get; set; }
    //是否重复执行
    public  bool IsRepeat { set; get; }
    //任务回调
    public TimeTaskDelegate TimeTaskCallBack { set; get; } 

    public TimerTask(float _timeDelay,bool _isRepeat,TimeTaskDelegate _timeTaskDelegate)
    {
        TimeDelay = _timeDelay;
        TimeDelayOnly = _timeDelay;
        IsRepeat = _isRepeat;
        TimeTaskCallBack = _timeTaskDelegate;
    }


}

在写一个测试脚本:

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

public class TestTimerTask : MonoBehaviour
{

    private void Start()
    {
        TimerTaskManager.Instance.AddTimeTask(6f, true, TestFunA);
        TimerTaskManager.Instance.AddTimeTask(3f, true, TestFunB);
        TimerTaskManager.Instance.AddTimeTask(2f, false, TestFunC);

    }

    private void TestFunA()
    {
        Debug.Log("任务A");
    }
    private void TestFunB()
    {
        Debug.Log("任务B");
    }
    private void TestFunC()
    {
        Debug.Log("任务C");
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Q))
        {
            TimerTaskManager.Instance.RemoveTask(TestFunA);
        }
    }

}

最后输出结果:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值