Unity 计时任务管理器TimeHandle

embedded/2024/9/24 15:18:16/

前言

        项目体量过大时,在很多脚本用到了携程计时或者写在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/embedded/7133.html

相关文章

Vue通俗概念理解

一.Vue的概念&#xff1a; 当你需要构建一个网页&#xff0c;让它可以随着用户的操作而改变状态时&#xff0c;Vue就像是一把神奇的魔杖&#xff0c;可以轻松帮你实现这些交互成果&#xff0c;它可以让你你的网页变得更有活力&#xff0c;更加容易理解和管理。 二.Vue 常用指…

Java基础之JVM对象内存分配机制简介

一 对象内存分配 1.1 运行时数据区域 1.2 常见java应用启动JVM参数&#xff1a; -Xss&#xff1a;每个线程的栈大小(单位kb)-Xms&#xff1a;堆的初始大小&#xff0c;默认物理内存的1/64,示例&#xff1a;-Xms:4g -Xms:10m-Xmx&#xff1a;堆的最大可用大小&#xff0c;默认物…

vue3表单参数校验+正则表达式

我们的表单中有用户名、密码、电话号码、邮箱这四个项。 我们设置用户名为3到20位的非空字符 密码为3到25位非空字符 电话号码就用目前用的电话号码正则表达式&#xff0c;要求手机号码以 1 开头&#xff0c;第二位为 3 到 9 之间的数字&#xff0c;后面跟着任意 9 个数字&a…

【npm】常用的NPM命令及在开发过程中的应用

常用的NPM命令及在开发过程中的应用 NPM&#xff08;Node Package Manager&#xff09;是JavaScript的包管理工具&#xff0c;也是世界上最大的软件注册表。它允许开发者共享和重用代码&#xff0c;并便于管理各种Node.js的包依赖。本文将介绍一些常用的NPM命令&#xff0c;并…

大话设计模式之享元模式

享元模式是一种结构型设计模式&#xff0c;旨在有效地支持大量细粒度的对象共享&#xff0c;从而减少内存消耗和提高性能。 在享元模式中&#xff0c;对象分为两种&#xff1a;内部状态&#xff08;Intrinsic State&#xff09;和外部状态&#xff08;Extrinsic State&#xf…

【C++刷题】优选算法——动态规划第四辑

回文子串 状态表示:dp[i][j]: 表示以i位置开始&#xff0c;j位置结尾的子串是否是回文串 状态转移方程:i j: dp[i][j] true;i 1 j && s[i] s[j]: dp[i][j] true;i 1 < j && dp[i1][j-1] && s[i] s[j]: dp[i][j] true;int countSubstrings…

数据分析(1)

数据分析基础&#xff08;1&#xff09; 为了让刚开始学习的朋友对数据分析有一个清晰的整体认识&#xff0c;因此笔者在此对数分进行一个较为详细的介绍有助于大家更好的在宏观层面进行理解&#xff0c;避免在后续学习中产生迷茫。 数据分析的概念 定义&#xff1a;数据分析…

富文本编辑器(wangEdit)+(jquery.wordexport)实现web版在线编辑导出

小插曲&#xff1a;最开始的方向是Html5的contenteditable"true"的文档可编辑属性。只能修改文档文字内容&#xff0c;不能修改样式&#xff0c;如修改字体&#xff0c;字号&#xff0c;颜色等。于是用了第一款&#xff08;quil&#xff09;富文本插件。只能说一般&a…