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);
}
}
秒单位的计时器
最新推荐文章于 2023-08-12 14:06:04 发布