unity简单示例——延迟操作-定时器

这篇博客介绍了在Unity中如何不依赖脚本实现定时器。通过`WaitTimeManager`类,我们可以延迟执行指定的UnityAction。此外,`TaskIntervalBehaviour`类展示了如何创建一个可循环并按固定间隔调用的定时器。这个定时器使用`CustomWait`类,该类继承自`CustomYieldInstruction`,可以根据设定的时间间隔进行回调。

不依赖于脚本实现的定时器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
/****************************************************
作者:cg
功能:延迟一定时间后执行
*****************************************************/
public class WaitTimeManager
{
    private static TaskBehaviour m_task;
    static WaitTimeManager()
    {
        GameObject go = new GameObject("#WaitTimeManager#");
        GameObject.DontDestroyOnLoad(go);
        m_task = go.AddComponent<TaskBehaviour>();
    }

    public static Coroutine WaitTime(float time,UnityAction action)
    {
        return m_task.StartCoroutine(CustomCoroutine(time, action));
    }
    public static void Cancel(ref Coroutine coroutine)
    {
        if(coroutine!=null)
        {
            m_task.StopCoroutine(coroutine);
            coroutine = null;
        }
    }

    static IEnumerator CustomCoroutine(float time,UnityAction callback)
    {
        yield return new WaitForSeconds(time);
        if(callback!=null)
        {
            callback();
        }
    }
    class TaskBehaviour : MonoBehaviour { }
}

可循环隔一定时间间隔调用定时器

class TaskIntervalBehaviour : MonoBehaviour
    {
        IEnumerator Start()
        {//可以循环调用,利用Start自己开始
            //十秒后结束
            yield return new CustomWait(10f, 1f, delegate () {
                Debug.LogFormat("每过一秒回调一次 :{0}", Time.time);

            });
            Debug.Log("十秒结束");
        }



        public class CustomWait : CustomYieldInstruction
        {
            public override bool keepWaiting
            {
                get
                {
                    //此方法返回false表示协程结束
                    if (Time.time - m_StartTime >= m_Time)
                    {
                        return false;
                    }
                    else if (Time.time - m_LastTime >= m_Interval)
                    {
                        //更新上一次间隔时间
                        m_LastTime = Time.time;
                        m_IntervalCallback();
                    }
                    return true;
                }
            }

            private UnityAction m_IntervalCallback;
            private float m_StartTime;
            private float m_LastTime;
            private float m_Interval;
            private float m_Time;

            public CustomWait(float time, float interval, UnityAction callback)
            {
                //记录开始时间
                m_StartTime = Time.time;
                //记录上一次间隔时间
                m_LastTime = Time.time;
                //记录间隔调用时间
                m_Interval = interval;
                //记录总时间
                m_Time = time;
                //间隔回调
                m_IntervalCallback = callback;
            }
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值