Unity中定時執行事件的定時器
阿新 • • 發佈:2019-02-12
Unity開發一年多了,菜鳥一個,最近半年專案做得緊,一直想寫寫部落格記錄下專案中遇見的困難和最後解決辦法,可是由於各種原因沒有啟動,今天終於開始啟動了!!!
一直從事VR開發,專案中經常需要用到定時執行某一事件的功能,因此寫了一個簡易定時器,勉強夠用。下面直接上程式碼:
下面這個指令碼主要作用是建立一個空物件(從創建出來到遊戲結束時),用來掛載各種需要常載指令碼。
using UnityEngine; public class DontDestroyGO<T> : MonoBehaviour where T: MonoBehaviour { protected static GameObject dontDestroyGO; //建立掛載定時器指令碼的遊戲物件 internal static void CreateDontDestroyGO() { if (dontDestroyGO == null) { dontDestroyGO = new GameObject("DontDestroyGO"); DontDestroyOnLoad(dontDestroyGO); #if (UNITY_EDITOR && !DEBUG) dontDestroyGO.hideFlags = HideFlags.HideInHierarchy; #endif} if (!dontDestroyGO.GetComponent<T>()) ontDestroyGO.AddComponent<T>(); }}
接下來上定時器的指令碼
using UnityEngine; using System.Collections.Generic; using System; namespace HMLTools { /// <summary> /// 定時任務控制 /// </summary> public class TimerEvent : DontDestroyGO<TimerEvent> { static List<float> timer_Timer = new List<float>();//記錄使用者傳入的定時時間 static List<float> timer_Time = new List<float>();//定時器,對應每個事件 static List<Action> eventList = new List<Action>();//儲存新增的定時事件 static List<bool> isRepeat = new List<bool>();//儲存每個事件的條件(是否重複) void FixedUpdate() { if (timer_Time.Count < 1) return; for (int i = 0; i < timer_Time.Count; i++) { timer_Time[i] -= Time.fixedDeltaTime;//開始計時 if (timer_Time[i] <= 0) { eventList[i]();//計時完畢後執行事件 if (isRepeat[i]) timer_Time[i] = timer_Timer[i];//如果此事件為重複執行的事件,則重置計時時間 else { //如果為單次執行事件,執行完則移除該事件及該事件的其他資訊 timer_Timer.RemoveAt(i); timer_Time.RemoveAt(i); eventList.RemoveAt(i); isRepeat.RemoveAt(i); } } } } /// <summary> /// 新增固定更新定時事件 /// </summary> /// <param name="time">定時時長</param> /// <param name="callback">回撥事件</param> /// <param name="isrepeat">是否重複(不傳入,則預設為不重複執行)</param> public static void Add(float time, Action callback, bool isrepeat = false) { CreateDontDestroyGO();//新增事件時,如果沒有常存物件,則建立一個;有的話則跳過 timer_Timer.Add(time); timer_Time.Add(time); eventList.Add(callback); isRepeat.Add(isrepeat); } } }
程式碼沒什麼難度很容易理解,在此希望各位大神留下寶貴的意見,我好改進,謝謝!