UI不用继承MonoBehaviour,实现Update的TimerManager

这个示例展示了如何在Unity中创建一个独立于MonoBehaviour的TimerManager,用于UI定时更新。TimerManager类使用静态实例管理一组TimerEntity,每个实体包含延迟、回调和计数器等属性。通过Update方法进行定时任务的执行,添加、移除和清理定时器。该实现允许UI组件不直接继承MonoBehaviour,简化了代码结构。
摘要由CSDN通过智能技术生成

UI不用继承MonoBehaviour,实现Update的TimerManager

/*----------------------------------------------------------------
 Created by 王银
 文件名: TimerManager
 创建时间: 2022.6.16
 文件功能描述:UI不用继承MonoBehaviour,实现Update的TimerManager {去除空行的正则表达式  (?<=\r\n)\r\n}
 Copyright © 2022年 王银 All rights reserved.
----------------------------------------------------------------*/
using UnityEngine;
using System.Collections.Generic;
public class TimerEntity
{
    static int TimeCode = 1;
    public int code = 0;
    public float delay = 0;
    public float oldTime = 0;
    public int maxCount = 0;
    public TimerManager.TimerCallBack callBack;
    public bool isRemove = false;
    public TimerEntity(float delay, TimerManager.TimerCallBack callBack, int maxCount)
    {
        this.delay = delay;
        this.callBack = callBack;
        this.maxCount = maxCount;
        this.oldTime = Time.realtimeSinceStartup;
        this.code = TimerEntity.TimeCode++;
    }
}
public class TimerManager
{
    /// <summary>
    /// 时钟回调
    /// </summary>
    public delegate void TimerCallBack(int value);
    public static readonly TimerManager instance = new TimerManager();
    private Dictionary<int, TimerEntity> timerDic;
    private List<TimerEntity> timerList;
    private int count = 0;
    public TimerManager()
    {
        timerDic = new Dictionary<int, TimerEntity>();
        timerList = new List<TimerEntity>();
    }
    public void Update()
    {
        if (count > 0)
        {
            TimerEntity timer;
            float nowTime = Time.realtimeSinceStartup;
            int num = 0;
            for (int i = 0; i < count;)
            {
                timer = timerList[i];
                if (timer.isRemove)
                {
                    RemoveTimer(timer, i);
                    continue;
                }
                num = (int)((nowTime - timer.oldTime) / timer.delay);
                if (num > 0)
                {
                    timer.maxCount -= num;
                    timer.oldTime += num * timer.delay;
                    try
                    {
                        timer.callBack(num);
                    }
                    catch (System.Exception e)
                    {
                        Debug.LogError("Stack=" + e.StackTrace);
                        RemoveTimer(timer, i);
                        continue;
                    }
                    if (timer.maxCount <= 0)
                    {
                        RemoveTimer(timer, i);
                        continue;
                    }
                }
                i++;
            }
        }
    }
    ///         int id=TimerManager.instance.Add((int value1) => {}, 0.1f, 1, false);
    ///         TimerManager.instance.Remove(id);
    /// <summary>
    /// 添加时钟
    /// </summary>
    public int Add(TimerCallBack callBack, float delay, int maxCount = int.MaxValue, bool immediate = false)
    {
        TimerEntity timer = new TimerEntity(delay, callBack, maxCount);
        if (immediate)
        {
            try
            {
                callBack.Invoke(1);
            }
            catch (System.Exception e)
            {
                Debug.LogError("Stack=" + e.StackTrace);
                return -1;
            }
        }
        timerDic.Add(timer.code, timer);
        timerList.Add(timer);
        count++;
        return timer.code;
    }
    /// <summary>
    /// 移除时钟
    /// </summary>
    public void Remove(int code)
    {
        TimerEntity timer;
        if (timerDic.TryGetValue(code, out timer))
        {
            timer.isRemove = true;
        }
    }
    /// <summary>
    /// 移除时钟
    /// </summary>
    private void RemoveTimer(TimerEntity timer, int index)
    {
        timer.callBack = null;
        timerDic.Remove(timer.code);
        timerList.RemoveAt(index);
        count--;
    }
    public void Clear()
    {
        timerDic.Clear();
        timerList.Clear();
        count = 0;
    }
}
//使用案例
int id = TimerManager.instance.Add((int value1) =>
         {
             //2秒后关闭Tip_UI
             UIManager.Instance.HideView(WindowName.Tip_UI);
         }, 2, 1);


//本UI关闭时回收(或析构函数调用)
TimerManager.instance.Remove(id);

在其他管理类中调用TimerManager的Update()即可!

Demo文件下载地址:

(1条消息) 用Unity随手写的一个Demo-Unity3D文档类资源-CSDN文库https://download.csdn.net/download/hack_yin/85697955

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王 银

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值