Unity 计时器 定时器

简介: 在网上找了一些资料,自己修改了,实现比较简单,要求精度不是很高的用这个没有问题效果如下:代码如下:using UnityEngine;using System.

在网上找了一些资料,自己修改了,实现比较简单,要求精度不是很高的用这个没有问题

效果如下:

img_70f52b2c2b8072c14bb496ed4b2cba94.gif
代码如下:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class Timer
{
    #region Public Parameters
    /// <summary>
    /// 开始时间
    /// </summary>
    public float StartTime { get; private set; }
    /// <summary>
    /// 延迟时间(开始后的多少秒执行)
    /// </summary>
    public float DelayTime { get; private set; }
    /// <summary>
    /// 持续时间
    /// </summary>
    public float Duration { get; private set; }
    /// <summary>
    /// 结束的时间点
    /// </summary>
    public float EndTime { get; private set; }
    /// <summary>
    /// 当前计时器运行的总时间点
    /// </summary>
    public float CurTime { get; private set; }

    /// <summary>
    /// 运行标识
    /// </summary>
    public bool IsStart { get; private set; }
    /// <summary>
    /// 运行标识
    /// </summary>
    public bool IsPause { get; private set; }

    //开始和结束等事件
    public event Action OnStart;
    public event Action OnEnd;
    public event Action OnUpdate;
    public event Action OnCancel;
    public event Action OnPause;
    public event Action OnContinue;

    //Add
    public event Action OnUpdateCustom;
    public float UpdateCustomTime = 1.0f;
    public float TempUpdateCustomTime = 0.0f;

    /// <summary>
    /// 开始次数
    /// </summary>
    public int StartCount { get; private set; }
    /// <summary>
    /// 完成次数
    /// </summary>
    public int FinishCount { get; private set; }

    private float originalDelayTime;
    private float originalDurationTime;
    #endregion
    /// <summary>
    /// 构造函数,设置计时器
    /// </summary>
    /// <param name="duration">需要执行多少时间</param>
    public Timer(float duration)
    {
        Duration = duration;
        originalDelayTime = 0;
        originalDurationTime = duration;
        DelayTime = 0;
    }
    /// <summary>
    /// 构造函数,设置计时器
    /// </summary>
    /// <param name="delaytime">延迟多少秒后执行</param>
    /// <param name="duration">需要执行的时间</param>
    public Timer(float delaytime, float duration)
    {
        Duration = duration;
        originalDelayTime = delaytime;
        originalDurationTime = duration;
        DelayTime = delaytime;
    }

    /// <summary>
    /// 百分比
    /// </summary>
    public float Ratio
    {
        get
        {
            if (!IsStart)
            {
                return 0;
            }
            else
            {
                return (EndTime - CurTime) / Duration;
            }
        }
    }


    //开始计时 Timer类不继承于MonoBehavior,该方法不会在任何对象开始时被调用。
    public void Start()
    {
        IsStart = true;
        IsPause = false;

        StartTime = Time.time;
        CurTime = StartTime;
        EndTime = StartTime + Duration;
        TempUpdateCustomTime = UpdateCustomTime;
        ++StartCount;
        TimerUpdate.RemoveTimer(this);
        TimerUpdate.AddTimer(this);
        if (OnStart != null) OnStart();
    }

    //更新时间,并检查状态。
    public void Update()
    {
        CurTime += Time.deltaTime;

        if (IsPause)
        {
            EndTime += Time.deltaTime;
        }

        if (DelayTime > 0 && !IsPause)
        {
            DelayTime -= Time.deltaTime;
            EndTime += Time.deltaTime;
            Debug.Log("执行延迟");
        }
        else if (CurTime > EndTime)
        {
            End();
        }
        else if (OnUpdate != null && !IsPause)
        {
            OnUpdate();
        }
        else if (OnUpdateCustom != null && !IsPause)//Add
        {
            TempUpdateCustomTime -= Time.fixedDeltaTime;
            if (TempUpdateCustomTime <= 0)
            {
                if (OnUpdateCustom != null) OnUpdateCustom();
                TempUpdateCustomTime = UpdateCustomTime;
            }
        }

    }

    //计时器结束
    public void End()
    {
        IsStart = true;
        FinishCount++;
        if (OnEnd != null) OnEnd();
        TimerUpdate.RemoveTimer(this);
    }

    //取消接口
    public void Cancel()
    {
        IsStart = false;
        if (OnCancel != null) OnCancel();
        TimerUpdate.RemoveTimer(this);
        DelayTime = originalDelayTime;
        Duration = originalDurationTime;
    }
    //暂停接口
    public void Pause()
    {
        IsPause = true;
        if (OnPause != null) OnPause();
    }

    //继续接口
    public void Continue()
    {
        IsPause = false;
        if (OnContinue != null) OnContinue();
    }

    //重置清零接口
    public void Reset()
    {
        IsStart = false;
        IsPause = false;

        TimerUpdate.RemoveTimer(this);
    }
    /// <summary>
    /// 重新开始
    /// </summary>
    public void Restart()
    {
        DelayTime = originalDelayTime;
        Duration = originalDurationTime;
        Start();
    }
}


public class TimerUpdate : MonoBehaviour
{
    static List<Timer> timers = new List<Timer>();

    //添加计时器
    public static void AddTimer(Timer timer)
    {

        if (!timers.Contains(timer))
        {
            timers.Add(timer);
        }
        else
        {
            Debug.LogWarning("已经添加此计时器,请勿重复添加");
        }
    }

    //移除计时器
    public static void RemoveTimer(Timer timer)
    {
        if (timers.Contains(timer))
        {
            timers.Remove(timer);
        }
    }

    //每帧更新
    void FixedUpdate()
    {
        for (int i = 0; i < timers.Count; i++)
        {
            timers[i].Update();
        }

    }

}

逻辑Code:

using UnityEngine;
using System.Collections;

public class TestCube : MonoBehaviour {

    Timer time1;

    void Start ()
    {
        time1 = new Timer(0,10);
        time1.OnUpdate += SetScale;
    }

    void SetScale()
    {
        transform.localScale = new Vector3(time1.Ratio, time1.Ratio, time1.Ratio);
    }

    public void StartBtn()
    {
        time1.Start();
    }
    public void PauseBtn()
    {
        time1.Pause();
    }
    public void ContinueBtn()
    {
        time1.Continue();
    }
    public void CancelBtn()
    {
        time1.Cancel();
    }
    public void ResetBtn()
    {
        time1.Reset();
    }
    public void RestartBtn()
    {
        time1.Restart();
    }
}
相关文章
|
Go 图形学 JavaScript
Unity中的定时器与延时器
JavaScript中的定时器与延时器,分别是 setInterval、setTimeout,对应的清理函数是:clearInterval、clearTimeout。 而在Unity中,则分别是:Invoke、InvokeRepeating和取消延迟调用  CancelInvoke   延迟调用 v...
1314 0
|
18天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
27 2
|
18天前
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
33 0
|
18天前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
31 2
|
18天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
29 2
|
18天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
16 1
|
18天前
|
存储 JSON 图形学
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
21 0
|
18天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
23 0