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...
1305 0
|
8天前
|
开发框架 Java C#
【Unity逆向】玩游戏遇到的“飞天锁血”是怎么实现的?
【Unity逆向】玩游戏遇到的“飞天锁血”是怎么实现的?
99 0
|
8天前
|
存储 自然语言处理 监控
【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换
Unity的多语言本地化是一个很实用的功能,它可以帮助游戏支持多种语言,让不同语言的玩家都能够更好地体验游戏。 而实现本地化的方案也有很多种,各个方案之间也各有优劣,后面也会对多个方案进行介绍学习。 本文就来介绍一个专门作用于多语言本地化的Unity官方插件:Localization 。 这个插件方便进行游戏的多语言本地化,让游戏支持多种语言,下面就来看看该插件的使用方法吧!
|
8天前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
85 2
|
9月前
|
开发框架 Java .NET
《unity游戏优化》第8章内存优化
《unity游戏优化》第8章内存优化
|
8天前
|
运维 API C#
【Unity游戏破解】外挂原理分析
【Unity游戏破解】外挂原理分析
177 0
【Unity游戏破解】外挂原理分析
|
8天前
|
vr&ar 图形学
【Unity 3D】VR飞机起飞喷火游戏案例实战(附源码和演示视频 超详细)
【Unity 3D】VR飞机起飞喷火游戏案例实战(附源码和演示视频 超详细)
66 0
|
8天前
|
图形学
【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
197 0