Unity中定时执行事件的定时器

       Unity开发一年多了,菜鸟一个,最近半年项目做得紧,一直想写写博客记录下项目中遇见的困难和最后解决办法,可是由于各种原因没有启动,今天终于开始启动了!!!

       一直从事VR开发,项目中经常需要用到定时执行某一事件的功能,因此写了一个简易定时器,勉强够用。下面直接上代码:

       下面这个脚本主要作用是创建一个空对象(从创建出来到游戏结束时),用来挂载各种需要常载脚本。

using UnityEngine;

public class DontDestroyGO<T> : MonoBehaviour where T: MonoBehaviour
{
    protected static GameObject dontDestroyGO;

    static T ins;
    public static T Ins
    {
        get
        {
            if (ins == null) CreateDontDestroyGO();
            return ins;
        }
    }
    //创建挂载常存的游戏对象
    internal static void CreateDontDestroyGO()
    {
        if (dontDestroyGO == null) dontDestroyGO = GameObject.Find("DontDestroyGO");
        if (dontDestroyGO == null)
        {
            dontDestroyGO = new GameObject("DontDestroyGO");
            DontDestroyOnLoad(dontDestroyGO);
        }
        if (ins) return;
        ins = dontDestroyGO.GetComponent<T>();
        if (ins == null) ins = dontDestroyGO.AddComponent<T>();
    }
}

接下来上定时器的脚本

using UnityEngine;
using System.Collections.Generic;
using System;

namespace HMLFramwork
{
    public class TimerTask
    {
        /// <summary>
        /// 延时时间
        /// </summary>
        public float delayed_time;
        /// <summary>
        /// 计时器,计时达到延时时间就执行事件
        /// </summary>
        public float timer;
        /// <summary>
        /// 是否重复执行
        /// </summary>
        public bool isRepeat;
        /// <summary>
        /// 事件当前状态:是暂停,还是继续
        /// </summary>
        public bool isPause;
        /// <summary>
        /// 事件
        /// </summary>
        public Action func;

        public TimerTask(float delayed_time, bool isRepeat, Action func)
        {
            this.delayed_time = delayed_time;
            timer = 0;
            this.isRepeat = isRepeat;
            this.isPause = false;
            this.func = func;
        }
    }
    /// <summary>
    /// 定时任务控制
    /// </summary>
    public class TimerEvent : DontDestroyGO<TimerEvent>
    {
        static List<TimerTask> timerTasks = new List<TimerTask>();

        void OnEnable()
        {
            Debug.Log("提醒:开启定时器...");
        }

        TimerTask taskTemp;
        void FixedUpdate()
        {
            if (pause) return;
            if (timerTasks.Count < 1) return;

            for (int i = 0; i < timerTasks.Count; i++)
            {
                taskTemp = timerTasks[i];
                if (!taskTemp.isPause) taskTemp.timer += Time.fixedDeltaTime;
                if (taskTemp.timer >= taskTemp.delayed_time)
                {
                    taskTemp.func.Invoke();
                    if (!taskTemp.isRepeat)
                    {
                        timerTasks.RemoveAt(i);
                        --i;
                        if (timerTasks.Count == 0) break;
                    }
                    else
                    {
                        taskTemp.timer = 0;
                    }
                }
            }

        }

        /// <summary>
        /// 添加固定更新定时事件
        /// </summary>
        /// <param name="time">定时时长</param>
        /// <param name="callback">回调事件</param>
        /// <param name="isrepeat">是否重复(不传入,则默认为不重复执行)</param>
        public static void Add(float delayedTime, Action func, bool isrepeat = false)
        {
            CreateDontDestroyGO();
            if (func != null)
            {
                bool isContain = false;
                for (int i = 0; i < timerTasks.Count; i++)
                {
                    if (timerTasks[i].func.Equals(func))
                    {
                        isContain = true;
                        break;
                    }
                }
                if (!isContain) timerTasks.Add(new TimerTask(delayedTime, isrepeat, func));
            }
        }

        /// <summary>
        /// 暂停延时事件的计时
        /// </summary>
        /// <param name="callback"></param>
        public static void Pause(Action func)
        {
            if (func != null)
            {
                for (int i = 0; i < timerTasks.Count; i++)
                {
                    var taskTemp = timerTasks[i];
                    if (taskTemp.func.Equals(func))
                    {
                        taskTemp.isPause = true;
                    }
                }
            }

        }

        /// <summary>
        /// 结束事件的计时暂停状态
        /// </summary>
        /// <param name="callback"></param>
        public static void UnPause(Action func)
        {
            if (func != null)
            {
                for (int i = 0; i < timerTasks.Count; i++)
                {
                    var taskTemp = timerTasks[i];
                    if (taskTemp.func.Equals(func))
                    {
                        taskTemp.isPause = false;
                    }
                }
            }
        }

        /// <summary>
        /// 移除指定事件
        /// </summary>
        /// <param name="callback"></param>
        public static void Remove(Action func)
        {
            if (func != null)
            {
                for (int i = 0; i < timerTasks.Count; i++)
                {
                    var taskTemp = timerTasks[i];
                    if (taskTemp.func.Equals(func))
                    {
                        timerTasks.Remove(taskTemp);
                    }
                }
            }
        }
        /// <summary>
        /// 清空定时任务
        /// </summary>
        public static void Clear()
        {
            timerTasks.Clear();
        }
    }
}

代码没什么难度,很容易理解。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值