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_UIUIManager.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

UI不用继承MonoBehaviour,实现Update的TimerManager相关推荐

  1. 继承MonoBehaviour类的优缺点和相关报错

    Unity3D文档里虽然说所有脚本继承MonoBehaviour类,但如果你想自定义类,就可以不用继承MonoBehaviour,但是这个类只能调用其中的方法和属性,无法拖到场景的物体中使用. 所有从 ...

  2. Unity+C#开发笔记(七)| unity中继承MonoBehaviour类的脚本里的函数怎么调用 | ╭(●`∀´●)╯╰(●’◡’●)╮

    继上文,有个蠢货单例模式只是用来引用,突然遇到了一个继承了MonoBehaviour的类,然后unity跟你讲:不!你不可以在我这里这么用! 啊这--吓得我当场百度... ************** ...

  3. unity 继承会调用start吗_Unity 继承MonoBehaviour脚本 执行顺序 详解

    先看结果 Awake ->OnEnable-> Start ->-> FixedUpdate-> Update  -> LateUpdate ->OnGUI ...

  4. IDEA的最新UI不用申请试用了,教你30秒搞定!

    昨天给大家介绍了IDEA官方宣布正在开发一套全新的UI,但目前是预览版需要申请才能体验.随后马上就有网友分享了,不需要申请直接就能激活体验的方法.下面就带大家学一下,如何直接体验! 只需要下面几步: ...

  5. unity万能的提示窗口

    这里给大家一个通用的提示或警告窗口的框架 首先先创建一个警告的Model类(不用继承MonoBehaviour)WarningModel using UnityEngine; using System ...

  6. Unity 3D官方教程——Tanks!学习记录

    1.游戏界面基础设置 先在官方资源商店导入Tank!的所有资源(怎样导入已在Survival Shooter中说明),新建_Scenes文件夹,将新场景命名为Main并保存. 删除Hierarchy下 ...

  7. Unity3D研究院之C#使用Socket与HTTP连接服务器传输数据包

    最近项目中需要使用HTTP与Socket,把自己这段时间学习的资料整理一下.有关Socket与HTTP的基础知识MOMO就不赘述拉,不懂得朋友自己谷歌吧.我们项目的需求是在登录的时候使用HTTP请求, ...

  8. C#反射的实现原理及简单应用

    目录 一.System.Type类 二.Assembly类 三.常用类 一.取得数据类型Type常用方式: 二.MethodInfo(方法) 三.PropertyInfo(属性) 四.FieldInf ...

  9. Unity事件函数OnMouseDown生效条件

    前言 通常,挂载一个脚本到物品上,可以通过重载函数OnMouseDown的方式直接实现鼠标点击该物品的逻辑. 然而,OnMouseDown这个方法并不是任何一个物品,场景下都可以生效的万能方法,我们还 ...

最新文章

  1. spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题
  2. offsetof宏和container_of宏
  3. 解决AttributeError: module ‘scipy.misc‘ has no attribute ‘imread‘报错问题
  4. 某聊天工具消息记录数据库文件解密逆向分析
  5. 京东云金山云合并确有其事,或拉开云计算兼并序幕
  6. C++总结笔记(八)—— 菱形继承
  7. vl_sift函数用法
  8. C语言验证大小端的几个方法
  9. RecycleView添加setEmptyView
  10. Makefile:Makefile中的调试打印方法
  11. 源码分析三:OkHttp(2)—拦截器简介
  12. (转)为什么用ls和du显示出来的文件大小有差别?
  13. 面试中常被问到(七)封装继承多态知多少
  14. 腾讯游戏扫码登录小程序
  15. python摩尔庄园自动弹琴
  16. UI设计师常用工具软件都有哪些,UI设计工具盘点
  17. C++ reflection/反射
  18. Graph Neural Network(GAE,GVAE,ARGA)
  19. 半自动ORM与全自动ORM框架有什么区别?
  20. OpenWrt的USB网口驱动使用

热门文章

  1. 公式编辑器mathtype中一些符号显示方框的解决方法
  2. Spring中PROPAGATION_REQUIRED是什么意思?
  3. IPv4和IPv6的数据报结构头部详解
  4. 【自动驾驶中的功能开发】
  5. 程序员离职摆摊卖东西4天赚1个月工资,网友:开分店,需要投资吗
  6. 批量计算机添加网络打印机方法,添加局域网打印机(网络打印机)的图文方法...
  7. 线上口才班:怎样在人多的时候讲话不紧张
  8. 顺序查找、折半查找的区别与联系
  9. slice和splice区别
  10. Zigbee-NXP-JN5169-BeyondStudio for NXP-问题集