Unity 计时任务管理器TimeHandle

server/2024/10/21 9:35:25/

前言

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

相关文章

代码学习记录49---单调栈

随想录日记part49 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.20 主要内容&#xff1a;今天开始要学习单调栈的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;柱状图中最大的矩形 84.柱状图中最大的矩形 Topic184.柱状图中最大的矩形 题目&…

使用python-can和cantools实现arxml报文解析、发送和接收的完整指南

文章目录 背景一、硬件支持二、环境准备1、python解释器安装2、python库安装 三、 收发案例四、 方法拓展1、canoe硬件调用2、回调函数介绍 结论 背景 在汽车行业中&#xff0c;CAN (Controller Area Network) 总线是用于车辆内部通信的关键技术。arxml文件是一种用于描述CAN消…

什么是持续集成系统?

持续集成&#xff08;Continuous Integration&#xff0c;简称CI&#xff09;是一种软件开发实践&#xff0c;在这种实践中&#xff0c;开发人员会频繁地&#xff08;可能每天多次&#xff09;将代码集成到共享的代码库中。每次代码提交后&#xff0c;自动执行构建和测试流程&a…

Pytorch或Tensorflow 深度学习库安装 (简易版)

Tensorflow 2.X安装 0、 pytorch 支持 conda虚拟环境 cuda 和 cudnn1、创建conda环境2、测试GPU是否可用3、在机器上安装cuda 和 cudnnCUDA 安装cudnn 安装 0、 pytorch 支持 conda虚拟环境 cuda 和 cudnn 如果只用pytorch&#xff0c; 只需在虚拟环境安装cuda 和 cudnn即可&am…

【Hadoop】- YARN概述[6]

目录 一、YARN & Reduce 二、分布式资源调度 - YARN 1、资源调度 2、YARN的资源调度 总结 一、YARN & Reduce MapReduce是基于YARN运行的&#xff0c;即没有YARN “无法” 运行MapReduce程序。 二、分布式资源调度 - YARN YARN&#xff08;Yet Another Resou…

基于 Spring Boot 博客系统开发(一)

基于 Spring Boot 博客系统开发&#xff08;一&#xff09; 本系统是简易的个人博客系统开发&#xff0c;为了更加熟练地掌握SprIng Boot 框架及相关技术的使用。&#x1f913;&#x1f913;&#x1f913; 本系统开发所需的环境及相关软件 操作系统&#xff1a;Windows Java…

鸿蒙OpenHarmony【轻量系统编写“Hello World”程序】 (基于Hi3861开发板)

编写“Hello World”程序 下方将通过修改源码的方式展示如何编写简单程序&#xff0c;输出“Hello world”。请在下载的源码目录中进行下述操作。 前提条件 已参考鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到…

mysql基础16——游标

游标 能够对结果集中的每一条记录进行定位 并对指向记录中的数据进行操作的数据结构 游标只能在存储程序内使用 存储程序包括存储过程和存储函数 创建存储函数 create function 函数名称 (参数) returns 数据类型 程序体 存储函数与存储过程的区别 存储函数必须返回一个值…