C#--定时回调系统:unity中定时器的实现

本文介绍了一种基于C#的高效计时器工具,适用于.NET Core/Framework服务器和Unity客户端环境。该工具支持时间定时,任务可循环、取消和替换,并提供独立线程或Update()驱动的计时方式。通过临时列表缓存和全局ID管理,确保了多线程操作的效率和安全性。
摘要由CSDN通过智能技术生成

开发基于C#语言实现的高效便捷计时器工具,可集成中在服务器(.net core/.net framework)以及Unity客户端环境中。定时任务可循环、可替换、可取消。可使用独立线程计时,也可以使用Update()驱动计时。自由集成,灵活性高。

开发目标:

1.支持时间定时

2.定时任务可循环,可取消,可替换

3.使用简单,调用方便

 

时间定时:

场景中创建一个Button组件,挂上GameRoot、TimerSystem脚本;

using UnityEngine;

public class GameRoot : MonoBehaviour {

    private void Start()
    {
        TimerSystem timerSystem = GetComponent<TimerSystem>();
        timerSystem.InitTimer();
    }

    public void ClickBtn()
    {
        Debug.Log("Add Time Task");
        TimerSystem._instance.AddTimerTask(FuncA,3.0f);
    }

    void FuncA()
    {
        Debug.Log("Delay Log");
    }
}
using System;

public class PETimeTask
{
    public float destTime;//多少时间后执行任务
    public Action callBack;// 要执行什么任务
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class TimerSystem : MonoBehaviour
{

    public static TimerSystem _instance;
    private List<PETimeTask> mTimerTaskList = new List<PETimeTask>();

    public void InitTimer()
    {
        _instance = this;
    }

    private void Update()
    {
        //遍历检测任务是否达到条件
        for (int i = 0; i < mTimerTaskList.Count; i++)
        {
            PETimeTask timeTask = mTimerTaskList[i];
            //任务时间超过当前时间
            if (timeTask.destTime > Time.realtimeSinceStartup)
            {
                continue;
            }
            else
            {
                Action action = timeTask.callBack;
                if (action != null)
                {
                    action();
                }
                //移除已经完成的任务
                mTimerTaskList.RemoveAt(i);
                i--;
            }
        }
    }

    //添加计时器任务
    public void AddTimerTask(Action callBack, float delay)
    {
        float destTime = Time.realtimeSinceStartup + delay;
        PETimeTask task = new PETimeTask();
        task.callBack = callBack;
        task.destTime = destTime;
        mTimerTaskList.Add(task);
    }
}

以上实现类似协程的效果↑

 

如何支持多线程定时任务?

--通过临时列表进行缓存,错开操作时间

--避免使用锁,提高操作效率

添加临时缓存列表:

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

public class TimerSystem : MonoBehaviour
{

    public static TimerSystem _instance;
    private List<PETimeTask> mTimerTaskList = new List<PETimeTask>();
    //临时缓存列表
    private List<PETimeTask> mTempTimeTaskList = new List<PETimeTask>();

    public void InitTimer()
    {
        _instance = this;
    }

    private void Update()
    {
        //加入缓存区中的定时任务
        for (int tempIndex = 0; tempIndex < mTempTimeTaskList.Count; tempIndex++)
        {
            mTimerTaskList.Add(mTempTimeTaskList[tempIndex]);
        }
        mTempTimeTaskList.Clear();

        //遍历检测任务是否达到条件
        for (int i = 0; i < mTimerTaskList.Count; i++)
        {
            PETimeTask timeTask = mTimerTaskList[i];
            //任务时间超过当前时间
            if (timeTask.destTime > Time.realtimeSinceStartup)
            {
                continue;
            }
            else
            {
                Action action = timeTask.callBack;
                if (action != null)
                {
                    action();
                }
                //移除已经完成的任务
                mTimerTaskList.RemoveAt(i);
                i--;
            }
        }
    }

    //添加计时器任务
    public void AddTimerTask(Action callBack, float delay)
    {
        float destTime = Time.realtimeSinceStartup + delay;
        PETimeTask task = new PETimeTask();
        task.callBack = callBack;
        task.destTime = destTime;
        mTempTimeTaskList.Add(task);
    }
}

扩展时间单位:

统一换算成最小的单位毫秒进行运算

using System;

public class PETimeTask
{
    public float destTime;//多少时间后执行任务 单位为毫秒
    public Action callBack;// 要执行什么任务
}

扩展时间单位
public enum PETimeUnit
{
    Millise,
    Second,
    Minute,
    Hour,
    Day
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class TimerSystem : MonoBehaviour
{

    public static TimerSystem _instance;
    private List<PETimeTask> mTimerTaskList = new List<PETimeTask>();
    //临时缓存列表
    private List<PETimeTask> mTempTimeTaskList = new List<PETimeTask>();

    public void InitTimer()
    {
        _instance = this;
    }

    //实现基础定时任务
    private void Update()
    {
        //加入缓存区中的定时任务
        for (int tempIndex = 0; tempIndex < mTempTimeTaskList.Count; tempIndex+
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值