秒单位的计时器

using UnityEngine;
using System;
using System.Collections;


public enum XTimerType
{
    eTime,
    eFrame,
}


public delegate void OnTimerEndCb(params object[] param);
public delegate bool OnTimerOverCb();


public class XTimerComponent : XMono
{
    public OnTimerEndCb mEndCallback;
    public OnTimerOverCb mTimerOverCallback;
    public object[] mParams;
    public XTimer mTimer;


    // 强制立即执行,并删除自己Timer!
    public void RunAndDelete()
    {
        mEndCallback(mParams);


        Destroy(this.gameObject);
    }


    void Update()
    {
        if(mTimer == null)
        {
            return;
        }


        if (!mTimer.IsRunning())
        {
            mEndCallback(mParams);


            bool isOver = true;
            if (mTimerOverCallback != null)
            {
                isOver = mTimerOverCallback();
            }


            if (isOver)
            {
                // 结束这个TimerComponent
                Destroy(this.gameObject);
            }
            else
            {
                mTimer.Reset();
            }
        }
    }


}


public class XTimer
{
    XTimerType mType;


    // 计秒
    float mStartTime;
    float mWaitSeconds;


    // 计帧
    int mStartFrame;
    int mWaitFrames;


    public XTimer(float waitSeconds)
    {
        mType = XTimerType.eTime;
        mStartTime = Time.time;
        mWaitSeconds = waitSeconds;
    }


    public XTimer(int waitFrames)
    {
        mType = XTimerType.eFrame;
        mStartFrame = XLostPlanet.mCurrentFrame;
        mWaitFrames = waitFrames;
    }


    private XTimer()
    {


    }


    public bool IsRunning()
    {
        bool result = false;


        if (mType == XTimerType.eFrame)
        {
            result = (XLostPlanet.mCurrentFrame - mStartFrame < mWaitFrames);
        }
        else
        {
            result = (Time.time - mStartTime < mWaitSeconds);
        }


        return result;
    }


    public void Reset()
    {
        if(mType == XTimerType.eTime)
        {
            mStartTime = Time.time;
        }
        else
        {
            mStartFrame = XLostPlanet.mCurrentFrame;
        }
    }
}


public class XTimerHelper : XIModule
{
    static XTimerHelper mInstance;


    public static XTimerHelper Inst
    {
        get
        {
            if (mInstance == null)
            {
                mInstance = new XTimerHelper();
            }
            return mInstance;
        }
    }


    public IEnumerator OnInit()
    {
        yield return null;
    }


    public void Activate()
    {


    }


    public IEnumerator OnUnInit()
    {
        yield return null;
    }


    public XTimerComponent RegisterTimer(float seconds, OnTimerEndCb endCallback, OnTimerOverCb overCallback, params object[] param)
    {
        GameObject timerObj = new GameObject("QTimer");
        XTimerComponent timerCom = timerObj.AddComponent<XTimerComponent>();


        timerCom.mTimer = new XTimer(seconds);
        timerCom.mEndCallback = endCallback;
        timerCom.mParams = param;
        timerCom.mTimerOverCallback = overCallback;


        GameObject.DontDestroyOnLoad(timerObj);


        return timerCom;
    }


    public XTimerComponent RegisterTimer(float seconds, OnTimerEndCb endCallback, params object[] param)
    {
        return RegisterTimer(seconds, endCallback, null, param);
    }


    public void RegisterTimer(int frames, OnTimerEndCb endCallback, OnTimerOverCb overCallback, params object[] param)
    {
        GameObject timerObj = new GameObject("QTimer");
        XTimerComponent timerCom = timerObj.AddComponent<XTimerComponent>();


        timerCom.mTimer = new XTimer(frames);


        timerCom.mEndCallback = endCallback;


        timerCom.mParams = param;


        timerCom.mTimerOverCallback = overCallback;


        GameObject.DontDestroyOnLoad(timerObj);
    }


    public void RegisterTimer(int frames, OnTimerEndCb endCallback, params object[] param)
    {
        RegisterTimer(frames, endCallback, null, param);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值