1、Timer timer = new Timer(); 建立時間管理器 參數(float time, TimeUnit timeUnit,bool ignoreTimeScale = false, bool autoStart = true) time:時間值、timeUnit 時間機關(幀率、秒、厘秒、毫秒)、ignoreTimeScale 忽略時間縮放(可以使遊戲暫停更容易實作)、autoStart 自動開始計時
2、timer.loop = true; // 循環 timer.Finished +=method; // 回調函數 timer.Pause(); // 暫停
using System.Collections.Generic;
using UnityEngine;
namespace Epitome
{
public delegate void FinishedHandler();
public class Timer
{
TimerManager.TimerState timer;
public bool Running { get { return timer.Running; } }
public bool Paused { get { return timer.Paused; } }
public bool Loop
{
set { timer.HasRepeat = value; }
get { return timer.HasRepeat; }
}
public event FinishedHandler Finished;
public Timer(float time, TimeUnit timeUnit,bool ignoreTimeScale = false, bool autoStart = true)
timer = TimerManager.Instance.CreateTimer(time, timeUnit, ignoreTimeScale);
timer.Finished += TimerFinished;
if (autoStart) timer.Start();
public void Start() { timer.Start(); }
public void Stop() { timer.Stop(); }
public void Pause() { timer.Pause(); }
public void UnPause() { timer.UnPause(); }
public void TimerFinished()
FinishedHandler handler = Finished;
if (handler != null)
handler();
}
public enum TimeUnit
FrameRate, // 幀率
Second, // 秒
CentiSecond, // 厘秒:是一秒的百分之一(0.01秒)
MilliSecond, // 毫秒:是一秒的千分之一(0.001秒)
public class TimerManager : MonoSingleton<TimerManager>
public class TimerState
bool running;
bool paused;
bool stopped;
public bool Running { get { return running; } }
public bool Paused { get { return paused; } }
public event FinishedHandler Finished;
private TimeUnit timeUnit;
private float delayTime; // 延遲時間
private float attackTime; // 啟動時間
private float currentTime; // 目前時間
public bool HasRepeat; // 一直重複
public bool ignoreTimeScale { get; private set; } // 忽略時間縮放
public TimerState(float time, TimeUnit unit, bool ignore)
{
timeUnit = unit;
ignoreTimeScale = ignore;
delayTime = time;
ResetState();
}
private void ResetState()
switch (timeUnit)
{
case TimeUnit.FrameRate:
currentTime = 0.0f;
break;
case TimeUnit.Second:
case TimeUnit.CentiSecond:
case TimeUnit.MilliSecond:
if (!ignoreTimeScale) currentTime = 0.0f;
else currentTime = Time.realtimeSinceStartup;
}
attackTime = delayTime + currentTime;
public void UpdateTime(float time)
time = ignoreTimeScale ? time - currentTime : time;
if (running)
if (paused) return;
switch (timeUnit)
{
case TimeUnit.FrameRate:
currentTime += 1;
break;
case TimeUnit.Second:
currentTime += time;
case TimeUnit.CentiSecond:
currentTime += time * 100;
case TimeUnit.MilliSecond:
currentTime += time * 1000;
}
if (currentTime >= attackTime)
if (HasRepeat)
{
ResetState();
}
else
Stop();
FinishedHandler handle = Finished;
if (handle != null)
handle();
public void Start()
running = true;
public void Stop()
stopped = true;
running = false;
public void Pause()
paused = true;
public void UnPause()
paused = false;
private List<TimerState> timerList = new List<TimerState>();
private void Update()
for (int i = 0; i < timerList.Count ; i++)
timerList[i].UpdateTime(timerList[i].ignoreTimeScale ? Time.realtimeSinceStartup : Time.deltaTime);
public TimerState CreateTimer(float time, TimeUnit timeUnit,bool ignoreTimeScale)
TimerState newTimer = new TimerState(time, timeUnit, ignoreTimeScale);
timerList.Add(newTimer);
return newTimer;
public void ClearTimer() { }
public void ClearAllTimer() { }
}
使用案例
public class text : MonoBehaviour {
// Use this for initialization
void Start () {
Time.timeScale = 3;
Timer timer = new Timer(1, TimeUnit.Second); //第三個參數是否忽略時間縮放帶來的影響
timer.Loop = true; // 設定可循環
timer.Finished += rw;
private void rw()
Debug.Log("你好");
---------------------