1. 程式人生 > >Unity中定時執行事件的定時器

Unity中定時執行事件的定時器

       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);
        }

    }
}

程式碼沒什麼難度很容易理解,在此希望各位大神留下寶貴的意見,我好改進,謝謝!