很好用,方便

using System;
using System.Collections.Generic;
using UnityEngine; public class TimerManager : MonoBehaviour
{
private List<Timer> _usedTimes = new List<Timer>();
private Queue<Timer> _canceledTimes = new Queue<Timer>(); public void Update()
{
int count = _usedTimes.Count;
for (int i = count -1; i >= 0; i--)
{
_usedTimes[i].Uptate();
}
}
public void CancelTimer(Timer timer)
{
_usedTimes.Remove(timer); if(_canceledTimes.Count < 10)
{
timer.Cancel();
_canceledTimes.Enqueue(timer);
}
}
public Timer AddTimer(float delayTime, Action excuteFunc)
{
return AddTimer(delayTime, 1, delayTime, false, excuteFunc, null, null);
}
public Timer AddTimer(float duration, int loopTimes, Action excuteFunc)
{
return AddTimer(duration, loopTimes, duration, false, excuteFunc, null, null);
}
public Timer AddTimer(float duration, float loopTimes, float delayTime, Action excuteFunc)
{
return AddTimer(duration, loopTimes, delayTime, false, excuteFunc, null, null);
}
public Timer AddTimer(float duration, float loopTimes, float delayTime, bool isRealTime, Action excuteFunc)
{
return AddTimer(duration, loopTimes, delayTime, isRealTime, excuteFunc, null, null);
}
/// <summary>
///
/// </summary>
/// <param name="duration">2次执行的时间间隔</param>
/// <param name="loopTimes">循环几次</param>
/// <param name="delayTime">第一次的延迟</param>
/// <param name="isRealTime">是否真实时间</param>
/// <param name="excuteFunc">执行体</param>
/// <param name="completeFunc">完成调用</param>
/// <param name="finishFunc">取消时调用</param>
/// <returns></returns>
public Timer AddTimer(float duration, float loopTimes, float delayTime, bool isRealTime, Action excuteFunc, Action completeFunc, Action finishFunc)
{
Timer timer = null;
if (_canceledTimes.Count > 0)
{
timer = _canceledTimes.Dequeue();
}
else
timer = new Timer(this); timer.Create(duration, loopTimes, delayTime, isRealTime, excuteFunc, completeFunc, finishFunc);
_usedTimes.Add(timer); return timer;
}
}
using System;
using UnityEngine; public class Timer
{
public Timer(TimerManager tm)
{
timerManager = tm;
} public float duration;
public float loopTimes;
public float delayTime;
public bool isRealTime;
public Action completeFunc;
public Action finishFunc;
public Action excuteFunc; private TimerManager timerManager;
private float _lastDoneTime;
private float _startTime;
public void Create(float duration, float loopTimes, float delayTime, bool isRealTime, Action excuteFunc, Action completeFunc, Action finishFunc)
{
this.duration = duration;
this.loopTimes = loopTimes;
this.delayTime = delayTime;
this.isRealTime = isRealTime;
this.completeFunc = completeFunc;
this.finishFunc = finishFunc;
this.excuteFunc = excuteFunc; float curTime = GetTime();
_startTime = curTime + delayTime;
}
public void Uptate()
{
float curTime = GetTime();
if (_lastDoneTime < 0)
{
// 第一次执行
if(curTime >= _startTime)
{
if (excuteFunc != null)
excuteFunc(); _lastDoneTime = curTime;
if(loopTimes != -1)
{
loopTimes--;
if(loopTimes == 0)
{
if (finishFunc != null)
finishFunc(); timerManager.CancelTimer(this);
}
}
}
}
else
{
// 循环执行
if (curTime - _lastDoneTime >= duration)
{
if (excuteFunc != null)
excuteFunc(); _lastDoneTime = curTime;
if (loopTimes != -1)
{
loopTimes--;
if (loopTimes == 0)
{
if (finishFunc != null)
finishFunc(); timerManager.CancelTimer(this);
}
}
}
}
}
private float GetTime()
{
if (isRealTime)
return Time.realtimeSinceStartup;
else
return Time.time;
}
public void Cancel()
{
_lastDoneTime = -1;
_startTime = 0;
}
}

Unity计时器系统的更多相关文章

  1. 三维软件转Unity的系统单位设置研究

    Unity的系统单位为米,其他3D软件的模型导入,而保持和Unity的比例一致是非常重要的,下面对各软件进行测试: ㈠. 3dsmax 转 Unity的比例为100:1:也就是说Unity单位是3ds ...

  2. Unity——计时器功能实现

    Unity计时器 Demo展示 介绍 游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法: 一般实现有一下几种方式: 1.手动计时 float persistTime = 10f flo ...

  3. Unity——射线系统

    Unity射线系统 Demo展示 UI+Physical射线测试: FPS自定义射线测试: UGUI射线工具 实现功能,鼠标点击UI,返回鼠标点击的UI对象: 需要使用到鼠标点击事件-PointerE ...

  4. Unity——技能系统(二)

    Unity技能系统(二) Unity技能系统(一) Demo展示: 五.技能管理和释放 1.CharacterSkillSystem 技能系统类,给外部(技能按钮,按键)提供技能释放方法: 技能释放逻 ...

  5. Unity——技能系统(三)

    Unity技能系统(三) Unity技能系统(一) Unity技能系统(二) Demo展示 六.Buff系统 buff分为增益和减益buff,应该区分开来: /// <summary> / ...

  6. unity shader序列帧动画代码,顺便吐槽一下unity shader系统

    一.看到UNITY论坛里有些人求unity shader序列帧动画,写shader我擅长啊,就顺势写了个CG的shader.代码很简单,就是变换UV采样序列帧贴图,美术配置行数列数以及变换速度. Sh ...

  7. Unity 动画系统

    Legacy动画系统:Animation组件(旧) Mecanim动画系统:Animator组件(新) 动画播放过程: //动画片段 [System.Serializable] public clas ...

  8. Unity 动画系统 Animation 和 Animator的小实例

    本文结合一个很简单的动画demo,分别采用2种方法,来对比Animation和Animator的使用方式: 方法1:单独使用Animation 方法2:Animation结合Animator 动画De ...

  9. Unity——技能系统(一)

    技能系统(一) 一.Demo展示 二.功能介绍 集成了技能,冷却,buff,UI显示,倒计时,动画等: 技能类型:弹道技能,动画事件根据帧数采用延迟调用技能,自定义释放位置(偏移,发射点两种),buf ...

  10. GJM : Unity调用系统窗口选择本地文件

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

随机推荐

  1. Linux系列:如何用perf跟踪.NET程序的mmap泄露

    一:背景 1. 讲故事 如何跟踪.NET程序的mmap泄露,这个问题困扰了我差不多一年的时间,即使在官方的github库中也找不到切实可行的方案,更多海外大佬只是推荐valgrind这款工具,但这款工 ...

  2. LSTM 原理

    之前在讨论 RNN (递归神经网络) 的梯度消失 和 梯度爆炸都会对咱的网络结构产生极大的影响. 梯度爆炸, 也是在参数更新这块, 调整步伐太大, 产生 NaN 或 Inf, 代码就搞崩了直解决梯度消 ...

  3. SpringBoot3 使用 SolonMCP 开发 MCP

    之前发了个 "<SpringBoot2 可以使用 SolonMCP 开发 MCP(江湖救急)>".然后,有人问:SpringBoot3 能不能用 SolonMCP? 其 ...

  4. 电脑tips #持续更新ing

    记录日常get 1. Esc+ Fn 打开与锁住F1到F12功能键们 2. 没有找到支持的视频格式和MIME类型 场景:发生在网页嵌入的视频中 原因及解决:--网速不好,重新刷新解决 3. 问题描述: ...

  5. MySQL5.7小白安装教程(提供安装包)

    下载地址:https://dev.mysql.com/downloads/installer/ (如果网络不稳定下不下来,别急,我已经为你们下好了.到我公众号[勾玉技术]回复[mysql5.7]获取百 ...

  6. 中国象棋小游戏(C版)

    中国象棋小游戏(C版) 说明: #include<graphics.h> 一个在 C/C++ 中用于图形编程的头文件,主要用于创建和操作图形界面.具有绘制图形.设置颜色.鼠标和键盘时间处理 ...

  7. 参加 Hugging Face 组织的 Gradio & MCP 智能体主题黑客松

    欢迎参加 Gradio & MCP 智能体主题黑客松! 准备好了吗?一场以智能体(Agent)和模型上下文协议(Model Context Protocol,简称 MCP)为核心的全球在线黑客 ...

  8. Django Web应用开发实战第一章

    一.常见域名后缀 .com:商业性的机构或公司. .net:从事Internet相关的网络服务的机构或公司. .org:非营利的组织.团体. .gov:政府部门. .cn:中国国内域名. .com.c ...

  9. Linux下安装Flume

    摘要 flume是由cloudera软件公司产出的可分布式日志收集系统,后于2009年被捐赠了apache软件基金会,为hadoop相关组件之一.尤其近几年随着flume的不断被完善以及升级版本的逐一 ...

  10. 编程记录:TypeScript中never类型的技巧

    技巧1 当我们在一个项目中,可能会去改动一个在整个项目中应用很广泛的函数的参数类型,但是可能由于代码量比较庞大,我们不好排查改了之后哪些地方会出现问题,此时我们可以使用never类型来辅助我们的函数, ...