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. [USACO2012 OPEN] Bookshelf

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2678 [算法] 首先不难想到如下DP : 记f[i]表示前i本书的高度和最小值 显然 ...

  2. 【扬中集训DAY2T2】 机智的AmyZhi

    [题目链接] 点击打开链接 [算法] 据说标算是暴力? 从N-200开始搜 不过我用了搜索+一些奇怪的剪枝,也A了.... [代码] 标程 #include<bits/stdc++.h> ...

  3. 【扬中集训 DAY4T1】跳马

    [题目链接] 点击打开链接 [算法] 数据范围很大,显然暴力是不能通过的 我们可以先打表,发现答案为 : 41 109 205 325 473 649 853 1085 1345 观察数列的差 68 ...

  4. Struts2声明式异常处理

    通过配置.xml文件的方式处理异常信息: 注意:配置.xml文件的同时还要抛出异常 标签:<exception-mapping></exception-mapping>和< ...

  5. maven 简单入门教学实战手册

    Maven那点事儿(Eclipse版)   前言: 由于最近工作学习,总是能碰到Maven的源码.虽然平时工作并不使用Maven,但是为了学习一些源码,还是必须要了解下.这篇文章不是一个全面的Mave ...

  6. PTA PAT Judge 【模拟题,未完待续】

    The ranklist of PAT is generated from the status list, which shows the scores of the submittions. Th ...

  7. springboot整合H2内存数据库,实现单元测试与数据库无关性

    一.新建spring boot工程 新建工程的时候,需要加入JPA,H2依赖 二.工程结构   pom文件依赖如下: <?xml version="1.0" encoding ...

  8. 鸟哥私房菜基础篇:Linux 的档案权限与目录配置习题

    猫宁!!! 参考链接:http://linux.vbird.org/linux_basic/0210filepermission.php 鸟哥是为中国信息技术发展做出巨大贡献的人. 1-早期的 Uni ...

  9. elasticsearch映射 mapping

    mapping的格式个应用,主要是创建索引(数据库)的时候指明type 的field类型,然后elasticsearch可以自动解析

  10. 安装 synaptic on ubuntu 18

    apt的图形化界面管理 sudo apt install synaptic 安装后使用需要注意的是 如果打开了synaptic,终端中apt命令某些是没法正常用的,比如说apt remove,应该是锁 ...