【Unity】製作一個C#實現的計時器

 

 

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class TimerItem
{
    public int id;
    public float interval;
    public int loopTimes;
    
    public UnityEngine.Object callbackObject;
    public object[] args;

    public Action callback;
    public Action<UnityEngine.Object> callbackObjectEvent;
    public Action<UnityEngine.Object, object[]> callbackObjAndArgs;
    public bool isNotLimtied;
    public bool isStop;

    private float _interval;

    

    public TimerItem(int id,  float interval, int loopTimes, Action action)
    {
        this.interval = interval;
        this.loopTimes = loopTimes;
        this.callback = action;
        isStop = false;
        _interval = this.interval;
        isNotLimtied = loopTimes == -1;
    }
    public TimerItem(int id, float interval, int loopTimes, Action<UnityEngine.Object> action, UnityEngine.Object obj)
    {
        this.interval = interval;
        this.loopTimes = loopTimes;
        this.callbackObjectEvent = action;
        this.callbackObject = obj;
        isStop = false;
        _interval = this.interval;
        isNotLimtied = loopTimes == -1;
    }
    public TimerItem(int id, float interval, int loopTimes, Action<UnityEngine.Object, object[]> action, UnityEngine.Object obj, object[] args)
    {
        this.interval = interval;
        this.loopTimes = loopTimes;
        this.callbackObjAndArgs = action;
        this.callbackObject = obj;
        this.args = args;
        isStop = false;
        _interval = this.interval;
        isNotLimtied = loopTimes == -1;
    }

    public void Reset()
    {
        this.interval = _interval;
        loopTimes--;
    }
}

public class TimerManager
{
    private Dictionary<int, TimerItem> _timerDicti;
    public int actionIndex;
    public TimerManager()
    {
        _timerDicti = new Dictionary<int, TimerItem>();
        actionIndex = 0;
    }
    /// <summary>
    /// 添加一個計時器,返回計時器的 ID
    /// </summary>
    /// <param name="interval">時間間隔</param>
    /// <param name="loopTimes">執行次數,-1表示無限執行</param>
    /// <param name="callback">執行函數</param>
    /// <returns></returns>
    public int AddTimer(float interval, int loopTimes, Action callback)
    {
        TimerItem item = new TimerItem(actionIndex, interval, loopTimes, callback);
        actionIndex++;
        if (!_timerDicti.ContainsKey(actionIndex))
        {
            _timerDicti.Add(actionIndex, item);
        }
        return actionIndex;
    }
    /// <summary>
    /// 添加一個計時器,返回計時器的 ID
    /// </summary>
    /// <param name="interval">時間間隔</param>
    /// <param name="loopTimes">執行次數,-1表示無限執行</param>
    /// <param name="callback">執行函數</param>
    /// <returns></returns>
    public int AddTimer(float interval, int loopTimes, Action<UnityEngine.Object> action, UnityEngine.Object obj)
    {
        TimerItem item = new TimerItem(actionIndex, interval, loopTimes, action, obj);
        actionIndex++;
        if (!_timerDicti.ContainsKey(actionIndex))
        {
            _timerDicti.Add(actionIndex, item);
        }
        return actionIndex;
    }
    /// <summary>
    /// 添加一個計時器,返回計時器的 ID
    /// </summary>
    /// <param name="interval">時間間隔</param>
    /// <param name="loopTimes">執行次數,-1表示無限執行</param>
    /// <param name="callback">執行函數</param>
    /// <returns></returns>
    public int AddTimer(float interval, int loopTimes, Action<UnityEngine.Object, object[]> action, UnityEngine.Object obj, object[] args)
    {
        TimerItem item = new TimerItem(actionIndex, interval, loopTimes, action, obj, args);
        actionIndex++;
        if (!_timerDicti.ContainsKey(actionIndex))
        {
            _timerDicti.Add(actionIndex, item);
        }
        return actionIndex;
    }

    public void Update(float intervalTime)
    {
        for (int i = 0; i < _timerDicti.Count;)
        {
            KeyValuePair<int, TimerItem> item = _timerDicti.ElementAt(i);
            i++;
            if (!item.Value.isStop)
            {
                if (item.Value.isNotLimtied || item.Value.loopTimes > 0)
                {
                    item.Value.interval -= intervalTime;
                    if (item.Value.interval <= 0)
                    {
                        if (item.Value.callback != null)
                        {
                            item.Value.callback();
                        }
                        if (item.Value.callbackObjectEvent != null && item.Value.callbackObject != null)
                        {
                            item.Value.callbackObjectEvent(item.Value.callbackObject);
                        }
                        if (item.Value.callbackObjAndArgs != null && item.Value.callbackObject != null && item.Value.args != null)
                        {
                            item.Value.callbackObjAndArgs(item.Value.callbackObject, item.Value.args);
                        }
                        item.Value.Reset();
                    }
                }
                else
                {
                    i--;
                    _timerDicti.Remove(item.Key);
                }
            }
        }
    }

    public void StopTimerById(int id, bool isStop = true)
    {
        if (_timerDicti.ContainsKey(id))
        {
            _timerDicti[id].isStop = isStop;
        }
    }

    public void RemoveTimerById(int id)
    {
        if (_timerDicti.ContainsKey(id))
        {
            _timerDicti.Remove(id);
        }
    }
}

 

 

測試代碼:


public class Core
{

    public static TimerManager _timerManager;
    public static TimerManager TimerManager
    {
        get
        {
            if(_timerManager == null)
            {
                _timerManager = new TimerManager();
            }
            return _timerManager;
        }
    }
}

public class Test : MonoBehaviour
{
     int index1;
    int index2;

    int id = 0;
    private void Awake()
    {

        object[] args = new object[3];
        args[0] = 1324;
        args[1] = 13232134;
        args[2] = 56565;
        int id = Core.TimerManager.AddTimer(1, -1, TimerTest1);
        Core.TimerManager.AddTimer(3, 2, TimerTest2, this.gameObject);
        Core.TimerManager.AddTimer(10, 2, TimerTest3, this.gameObject, args);
    }
    private void OnDestroy()
    {
        Core.TimerManager.RemoveTimerById(id);
    }

    private void TimerTest1()
    {
        Debug.LogError(++index1);
    }

    private void TimerTest2(UnityEngine.Object obj)
    {
        Debug.LogError(obj.name + (++index2));
    }

    private void TimerTest3(UnityEngine.Object obj, object[] args)
    {
        for (int i = 0; i < args.Length; i++)
        {
            Debug.LogError(args[i].ToString() + obj.name);
        }
    }
   private void FixedUpdate()
    {
        Core.TimerManager.Update(Time.fixedDeltaTime);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章