美文网首页csharp
Unity 计时器 定时器

Unity 计时器 定时器

作者: su9257_海澜 | 来源:发表于2017-09-28 17:42 被阅读107次

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

效果如下:

代码如下:
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();
    }
}

相关文章

  • Unity 计时器 定时器

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

  • 10.12知识点总结

    定时器 :高级控制 通用 基本 分频系数 计时器

  • 2018-05-30闭包和函数

    一、 计时器 一次性定时器 setTimeOut(function(){ ...

  • Day09(计时器,定时器,无缝轮播图)

    计时器函数 setInterval() 定时器函数 setTimeout() setTimeout();类似于...

  • 客户端的JavaScript(二)

    setTimeout和setInterval 定时器(计时器) setTimeout和setInterval都是客...

  • js

    一、计时器 css样式 script 一次性定时器 script 永久性定时器 二、instanceof

  • iOS - GCD 实现定时器、倒计时

    标签(空格分隔): 计时器 GCD timer 倒计时 GCD 定时器 NSTimer 的定时器是在 RunLoo...

  • js day 23

    一、计时器 css样式 script 一次性定时器 script 永久性定时器 二、instanceof 三、深度...

  • 自己造轮子: Unity打造Timer定时器框架

    1: 为什么我们要自己造轮子来做定时器系统 传统的Unity做定时器的方式有三种,总结如下: 这里有个unity学...

  • 14

    一、计时器 css样式 停止一次性定时器 停止永久性定时器 script 一次性定时器 var btn1=docu...

网友评论

    本文标题:Unity 计时器 定时器

    本文链接:https://www.haomeiwen.com/subject/qedvextx.html