1、Timer timer = new Timer(); 创建时间管理器 参数(float time, TimeUnit timeUnit,bool ignoreTimeScale = false, bool autoStart = true) time:时间值、timeUnit 时间单位(帧率、秒、厘秒、毫秒)、ignoreTimeScale 忽略时间缩放(可以使游戏暂停更容易实现)、autoStart 自动开始计时

2、timer.loop = true; // 循环          timer.Finished +=method;  // 回调函数     timer.Pause(); // 暂停

using System.Collections.Generic;
using UnityEngine;

namespace Epitome
{
    public delegate void FinishedHandler();

public class Timer
    {
        TimerManager.TimerState timer;

public bool Running { get { return timer.Running; } }

public bool Paused { get { return timer.Paused; } }

public bool Loop
        {
            set { timer.HasRepeat = value; }
            get { return timer.HasRepeat; }
        }

public event FinishedHandler Finished;

public Timer(float time, TimeUnit timeUnit,bool ignoreTimeScale = false, bool autoStart = true)
        {
            timer = TimerManager.Instance.CreateTimer(time, timeUnit, ignoreTimeScale);
            timer.Finished += TimerFinished;
            if (autoStart) timer.Start();
        }

public void Start() { timer.Start(); }

public void Stop() { timer.Stop(); }

public void Pause() { timer.Pause(); }

public void UnPause() { timer.UnPause(); }

public void TimerFinished()
        {
            FinishedHandler handler = Finished;
            if (handler != null)
                handler();
        }
    }

public enum TimeUnit
    {
        FrameRate, // 帧率
        Second, // 秒
        CentiSecond, // 厘秒:是一秒的百分之一(0.01秒)
        MilliSecond, // 毫秒:是一秒的千分之一(0.001秒)
    }

public class TimerManager : MonoSingleton<TimerManager>
    {
        public class TimerState
        {
            bool running;
            bool paused;
            bool stopped;

public bool Running { get { return running; } }

public bool Paused { get { return paused; } }

public event FinishedHandler Finished;

private TimeUnit timeUnit;

private float delayTime; // 延迟时间
            private float attackTime; // 启动时间
            private  float currentTime; // 当前时间

public bool HasRepeat; // 一直重复

public bool ignoreTimeScale { get; private set; } // 忽略时间缩放

public TimerState(float time, TimeUnit unit, bool ignore)
            {
                timeUnit = unit;
                ignoreTimeScale = ignore;

delayTime = time;

ResetState();
            }

private void ResetState()
            {
                switch (timeUnit)
                {
                    case TimeUnit.FrameRate:
                        currentTime = 0.0f;
                        break;
                    case TimeUnit.Second:
                    case TimeUnit.CentiSecond:
                    case TimeUnit.MilliSecond:
                        if (!ignoreTimeScale) currentTime = 0.0f;
                        else currentTime = Time.realtimeSinceStartup;
                        break;
                }

attackTime = delayTime + currentTime;
            }

public void UpdateTime(float time)
            {
                time = ignoreTimeScale ? time - currentTime : time;

if (running)
                {
                    if (paused) return;

switch (timeUnit)
                    {
                        case TimeUnit.FrameRate:
                            currentTime += 1;
                            break;
                        case TimeUnit.Second:
                            currentTime += time;
                            break;
                        case TimeUnit.CentiSecond:
                            currentTime += time * 100;
                            break;
                        case TimeUnit.MilliSecond:
                            currentTime += time * 1000;
                            break;
                    }

if (currentTime >= attackTime)
                    {
                        if (HasRepeat)
                        {
                            ResetState();
                        }
                        else
                        {
                            Stop();
                        }

FinishedHandler handle = Finished;
                        if (handle != null)
                        {
                            handle();
                        }
                    }
                }
            }

public void Start()
            {
                running = true;
            }

public void Stop()
            {
                stopped = true;
                running = false;
            }

public void Pause()
            {
                paused = true;
            }

public void UnPause()
            {
                paused = false;
            }
        }

private List<TimerState> timerList = new List<TimerState>();

private void Update()
        {
            for (int i = 0; i < timerList.Count ; i++)
            {
                timerList[i].UpdateTime(timerList[i].ignoreTimeScale ? Time.realtimeSinceStartup : Time.deltaTime);
            }
        }

public TimerState CreateTimer(float time, TimeUnit timeUnit,bool ignoreTimeScale)
        {
            TimerState newTimer = new TimerState(time, timeUnit, ignoreTimeScale);
            timerList.Add(newTimer);
            return newTimer;
        }

public void ClearTimer() { }
        public void ClearAllTimer() { }
    }
}

使用案例

public class text : MonoBehaviour {

// Use this for initialization
    void Start () {
        Time.timeScale = 3;

Timer timer = new Timer(1, TimeUnit.Second); //第三个参数是否忽略时间缩放带来的影响
        timer.Loop = true; // 设置可循环
        timer.Finished += rw; 
    }

private void rw()
    {
        Debug.Log("你好");
    }
}
---------------------

Unity3D——Epirome框架_TimerManager计时任务管理器的更多相关文章

  1. unity3D客户端框架

    unity3D客户端框架  博客

  2. Unity3D知识框架

    美术部分:           3d模型,材质,纹理,shader,Animator,Animation,天空盒,灯光效果,烘焙 程序部分:           基本组成:               ...

  3. Unity3d + PureMVC框架搭建

    0.流程:LoginView-SendNotification()---->LoginCommand--Execute()--->调用proxy中的函数操作模型数据--LoginProxy ...

  4. NancyFx框架之检测任务管理器

    先建一个空的项目和之前的NancyFx系列一样的步骤 然后建三个文件夹Models,Module,Views 然后分别安装一下组件 jQuery Microsoft.AspNet.SignalR Mi ...

  5. [Unity3D]Unity资料大全免费分享

     都是网上找的连七八糟的资料了,整理好分享的,有学习资料,视频,源码,插件……等等 东西比较多,不是所有的都是你需要的,可以按  ctrl+F 来搜索你要的东西,如果有广告,不用理会,关掉就可以了,如 ...

  6. [课程设计]Scrum 1.4 多鱼点餐系统开发进度(点餐页面框架布置)

    Scrum 1.4 多鱼点餐系统开发进度 (点餐页面框架布置) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系 ...

  7. Unity3D编程学习分享

    学习地址:http://www.ixueyun.com/lessons/detail-lessonId-692.html 一.课程概述: 以前大部分3D游戏出现在pc和ps.XBox等专业游戏主机上, ...

  8. 《开源框架那些事儿22》:UI框架设计实战

    UI是User Interface的缩写.通常被觉得是MVC中View的部分,作用是提供跟人机交互的可视化操作界面. MVC中Model提供内容给UI进行渲染,用户通过UI框架产生响应,一般而言会由控 ...

  9. [课程设计]Scrum 1.4 多鱼点餐系统开发进度

    Scrum 1.4 多鱼点餐系统开发进度 (点餐页面框架布置) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系 ...

随机推荐

  1. 【USACO】 Balanced Lineup

    [题目链接] 点击打开链接 [算法] 这是一道经典的最值查询(RMQ)问题. 我们首先想到线段树.但有没有更快的方法呢?对于这类问题,我们可以用ST表(稀疏表)算法求解. 稀疏表算法.其实也是一种动态 ...

  2. 你真的懂redis吗?

    Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行各种刁难.作为一名在互联网技术行业打击过成百上千名[请允许我夸张一下]的资深技术面试官 ...

  3. python之路,day6-面向对象

    一.面向过程编程 简单的说就是:如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程的方式是极好的,但是如果你要处理的任务比较复杂,且需要不断迭代和维护的,那还是用面向对象最方便了. 二.面向对 ...

  4. Windows 下openssl安装与配置

    编译thirift失败 网上方法很多,大部分是针对32位机的,自己的电脑因为是win7,64位,摸索了很久才安装成功. 环境 WIN7, 64位, vs2005 下载ActivePerl 配置过程中需 ...

  5. BZOJ3834:Solar Panels (分块)

    题意 询问两个区间[smin,smax],[wmin,smax]中是否存在k的倍数,使得k最大 分析 将其转化成\([\frac{smin-1}k,\frac{smax}k],[\frac{wmin- ...

  6. hdu1085 Holding Bin-Laden Captive!【生成函数】

    列出生成函数的多项式之后暴力乘即可 #include<iostream> #include<cstdio> #include<cstring> using name ...

  7. P3007 [USACO11JAN]大陆议会The Continental Cowngress(2-SAT)

    简述:给出 n 个法案, m 头牛的意见, 每头牛有两个表决 格式为 “支持或反对某法案”, 每头牛需要至少满足一个表决, 不可能成立的话输出 IMPOSSIBLE, 否则输出方案, Y代表能, N代 ...

  8. 51Nod 1013 3的幂的和(快速幂+逆元)

    #include <iostream> #include <algorithm> #include <string> #define MOD 1000000007 ...

  9. 如何为github已有仓库添加协议。

    在github创建开源项目的时候,github会引导开发者添加一个开源协议,直接照着操作即可.但是如果一开始没有添加开源协议,后面要怎么添加呢? 百度无果.多方打听.总结如下步骤. 1.首先,进入你的 ...

  10. Hexo瞎折腾系列(3) - 添加GitHub彩带和GitHub Corner

    页面右上角添加GitHub彩带 你可以在这里找到一共12种样式的GitHub彩带,复制其中的超链代码. 在themes\next\layout\_layout.swig目录下找到头部彩带相关的代码: ...