Unity 计时任务管理器TimeHandle

news/2024/9/24 7:46:44/

前言

        项目体量过大时,在很多脚本用到了携程计时或者写在update里面,不方便管理和代码阅读,很容易混淆,所以需要一个计时任务管理器来统一控制计时器模块,便于修改、管理。计时器有很多种写法,我这里写的是适用于我当前做的项目,并不适用于所有项目,写在这里只是起记录作用,有相同需求的可以作为参考。

        计时器归根结底底层逻辑还是用携程或者update,但是怎么样写才能更方便统一管理呢?

核心代码

        还有循环计时、计时完成CallBack功能待优化,等后续用到这些功能再扩展。目前只用于普通计时。

public class Timer{private Action<float> OnFinished;private float delyaTime;private bool isLoop;private bool isFinish;private float curTime = 0;/// <summary>/// 计时器/// </summary>/// <param name="onFinished">回调</param>/// <param name="delyaTime">计时时间</param>/// <param name="isLoop">是否循环</param>public Timer(Action<float> onFinished, float delyaTime, bool isLoop){OnFinished = onFinished;this.delyaTime = delyaTime;this.isLoop = isLoop;this.isFinish = false;}public bool IsFinish => isFinish;private void StopTimer() => isFinish = true;public void UpdataTimer(){if (isFinish) return;if (curTime < delyaTime) curTime += Time.deltaTime;var t = curTime.ToString("f0");if (t == delyaTime.ToString()){if (!isLoop){StopTimer();}}OnFinished?.Invoke(float.Parse(t));}}

内部调用代码:

/// <summary>/// 内部类/// </summary>public class TimeHandle : MonoBehaviour{private List<Timer> updateTimersList = new List<Timer>();public Timer TimerHandle(Action<float> onFinishef, float delayTime, bool isLoop = false){Timer timer = new Timer(onFinishef, delayTime, isLoop);updateTimersList.Add(timer);return timer;}public void Update(){if (updateTimersList.Count == 0) return;for (int i = 0; i < updateTimersList.Count; i++){if (updateTimersList[i].IsFinish){updateTimersList.RemoveAt(i);}else{updateTimersList[i].UpdataTimer();}}}} 

管理模块:

/// <summary>
/// 计时任务管理模块
/// </summary>
public class AppTimeMoudle : AppMoudle
{public TimeHandle Timer;public override void OnInit(){GameObject timer = new GameObject("AppTimeMoudle");Timer = timer.AddComponent<TimeHandle>();GameObject.DontDestroyOnLoad(timer);}public override void OnQuit() {GameObject.Destroy(Timer.gameObject);}
}

使用方法

        调用TimerHandle时,通过对返回参数进行加减或者对比操作来实现正反计时。  

(msg) =>
{var time = 2.0f;SimApp.AppMoudle<AppTimeMoudle>().Timer.TimerHandle((o) =>{_errorTip.text = msg;_errorTip.gameObject.SetActive(true);if (time - o <= 0){_errorTip.gameObject.SetActive(false);}},time,false);Debug.LogError(msg);
});

如果这边文章对你写计时器思路有帮助的话,那就点下赞吧,谢谢!


http://www.ppmy.cn/news/1428262.html

相关文章

Unity面向切面编程

一直说面向AOP&#xff08;切面&#xff09;编程&#xff0c;好久直接专门扒出理论、代码学习过。最近因为某些原因&#x1f62d;还得再学学造火箭的技术。 废话不多说&#xff0c;啥是AOP呢&#xff1f;这里我就不班门弄斧了&#xff0c;网上资料一大堆&#xff0c;解释的肯定…

排序之插入排序:从斗地主到插入排序

目录 1.斗地主如何摸牌 2.从摸牌想到插入排序 3.完成插入排序 4.结束语 1.斗地主如何摸牌 不知道各位是否玩过几乎人人都玩过的斗地主游戏呢&#xff1f;相必各位或多或少都玩过一点&#xff0c;再没玩过也看别人打过。今天博主就将从这个游戏为大家讲解我们的插入排序。 在…

使用 code-server 搭建在线的 VS Code 编辑器

文章目录 前言安装体验后记 前言 VS Code 是一个非常流行的代码编辑器&#xff0c;安装各种拓展下也可以当作全功能的IDE使用。VS Code本身是基于Web方案构建的&#xff0c;完全可以搭建服务器&#xff0c;然后通过浏览器访问。事实上官方就是这么设计的。现在打开任何一个Git…

应用编程之线程(二-同步篇)

线程的主要优势在于&#xff0c;资源的共享性&#xff0c;譬如通过全局变量来实现信息共享&#xff0c;不过这种便捷的共享是有代价的&#xff0c;那就是多个线程并发访问共享数据所导致的数据不一 致的问题。 一、为什么需要线程同步 线程同步是为了对共享资源的访问进行保护…

详解QListView、QListWidget、QTableView、QTableWidget的使用以及区别

在Qt框架中&#xff0c;QListView、QListWidget、QTableView和QTableWidget都是用于显示列表或表格数据的控件。它们在用途、数据模型、灵活性以及直接操作数据的便捷性等方面存在一定的差异。下面将详细阐述这些控件的使用方法以及它们之间的区别&#xff0c;并提供相应的C代码…

pdf在线免费转word网站推荐,纯免费、不注册

pdf在线免费转word网站推荐&#xff0c;纯免费、不注册 pdf在线免费转word文档 https://orcc.online/pdf 不限次数、免费不需要注册&#xff0c;上传之后过一段时间&#xff0c;右侧就会出现转换完成的word文档。 其他工具 时间戳转换 https://orcc.online/timestamp Base…

VL3 奇偶校验

奇偶校验 定义&#xff1a; 这里的奇偶是数据中&#xff0c;1的个数 比如奇校验为1 &#xff0c;就是说数据中1的个数是奇数个。 同理 偶校验为0.就是说数据中1的个数不是偶数个。 那么就说&#xff1a;奇校验为1 与 偶校验为0 互为否的关系&#xff08;not&#xff09;这里再…

聚观早报 | 理想L6正式发布;Meta发布Llama 3

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月20日消息 理想L6正式发布 Meta发布Llama 3 比亚迪秦L内饰曝光 小米14 Ultra推送新版澎湃OS OPPO A3 Pro正式…