在平時的開發過程中,計時、倒計時經常在遊戲中用到,想必大家都有自己的處理高招,爲了以後用方便使用,抽象出一個 TimerManager 類,功能很簡單,這兒採用協程的 WaitForSeconds 來處理計時、倒計時,希望對你有所幫助!
主要代碼如下:
001 |
using UnityEngine; |
002 |
using System; |
003 |
using System.Collections; |
004 |
using System.Collections.Generic; |
005 |
006 |
public class TimerManager |
007 |
{ |
008 |
private static Dictionary< string ,
TimerItem> dictList = new Dictionary< string ,
TimerItem>(); |
009 |
010 |
///
<summary> |
011 |
///
註冊計時 |
012 |
///
</summary> |
013 |
///
<param name="timerKey">Timer key.</param> |
014 |
///
<param name="totalNum">Total number.</param> |
015 |
///
<param name="delayTime">Delay time.</param> |
016 |
///
<param name="callback">Callback.</param> |
017 |
///
<param name="endCallback">End callback.</param> |
018 |
public static void Register( string timerKey, int totalNum, float delayTime,
Action< int >
callback, Action endCallback) |
019 |
{ |
020 |
TimerItem
timerItem = null ; |
021 |
if (!dictList.ContainsKey(timerKey)) |
022 |
{ |
023 |
GameObject
objectItem = new GameObject
(); |
024 |
objectItem.name
= timerKey; |
025 |
026 |
timerItem
= objectItem.AddComponent<TimerItem> (); |
027 |
dictList.Add(timerKey,
timerItem); |
028 |
} else |
029 |
{ |
030 |
timerItem
= dictList[timerKey]; |
031 |
} |
032 |
033 |
if (timerItem
!= null ) |
034 |
{ |
035 |
timerItem.Run(totalNum,
delayTime, callback, endCallback); |
036 |
} |
037 |
} |
038 |
039 |
///
<summary> |
040 |
///
取消註冊計時 |
041 |
///
</summary> |
042 |
///
<param name="timerKey">Timer key.</param> |
043 |
public static void UnRegister( string timerKey) |
044 |
{ |
045 |
if (!dictList.ContainsKey(timerKey)) return ; |
046 |
047 |
TimerItem
timerItem = dictList [timerKey]; |
048 |
if (timerItem
!= null ) |
049 |
{ |
050 |
timerItem.Stop
(); |
051 |
GameObject.Destroy(timerItem.gameObject); |
052 |
} |
053 |
} |
054 |
} |
055 |
056 |
class TimerItem
: MonoBehaviour |
057 |
{ |
058 |
private int totalNum; |
059 |
private float delayTime; |
060 |
private Action< int >
callback; |
061 |
private Action
endCallback; |
062 |
063 |
private int currentIndex; |
064 |
065 |
public void Run( int totalNum, float delayTime,
Action< int >
callback, Action endCallback) |
066 |
{ |
067 |
this .Stop
(); |
068 |
069 |
this .currentIndex
= 0; |
070 |
071 |
this .totalNum
= totalNum; |
072 |
this .delayTime
= delayTime; |
073 |
this .callback
= callback; |
074 |
this .endCallback
= endCallback; |
075 |
076 |
this .StartCoroutine
( "EnumeratorAction" ); |
077 |
} |
078 |
079 |
public void Stop() |
080 |
{ |
081 |
this .StopCoroutine
( "EnumeratorAction" ); |
082 |
} |
083 |
084 |
private IEnumerator
EnumeratorAction() |
085 |
{ |
086 |
yield return new WaitForSeconds
( this .delayTime); |
087 |
088 |
this .currentIndex
++; |
089 |
if ( this .callback
!= null ) this .callback( this .currentIndex); |
090 |
091 |
if ( this .totalNum
!= -1) |
092 |
{ |
093 |
if ( this .currentIndex
>= this .totalNum) |
094 |
{ |
095 |
if ( this .endCallback
!= null ) this .endCallback(); |
096 |
yield break ; |
097 |
} |
098 |
} |
099 |
this .StartCoroutine( "EnumeratorAction" ); |
100 |
} |
101 |
} |