加入收藏 | 设为首页 | 会员中心 | 我要投稿 南平站长网 (https://www.0599zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

unity完成延迟回调工具

发布时间:2021-11-12 21:27:39 所属栏目:教程 来源:互联网
导读:一个实用的计时器,可以计时延迟调用和延迟重复次数调用。 可以自己封装成单例模式挂在GameObject上使用,或者在另一个behavior的Update里执行这个类的OnUpdate()方法再使用。 为了更加安全的使用,建议在销毁MonoBehaviour时清理一下对应的所有计时器。
一个实用的计时器,可以计时延迟调用和延迟重复次数调用。
 
可以自己封装成单例模式挂在GameObject上使用,或者在另一个behavior的Update里执行这个类的OnUpdate()方法再使用。
 
为了更加安全的使用,建议在销毁MonoBehaviour时清理一下对应的所有计时器。
 
或者调用时可选择传入回调所在的MonoBehaviour,这样就可以自动清理了。
 
using System.Collections;
using System;
using System.Collections.Generic;
using UnityEngine;
 
public static class DelayCall
{
 
    private static List<CallTimeObj> calltimes = new List<CallTimeObj>();
    private static Dictionary<int, CallObj> callsort = new Dictionary<int, CallObj>();
    private static int countid = 0;
    /// <summary>
    /// 生成id
    /// </summary>
    /// <returns>The new identifier.</returns>
    /// <param name="call">Call.</param>
    private static int getNewId(CallObj call)
    {
        countid++;
        if (countid >= int.MaxValue)
        {
            countid = 1;
        }
        while (callsort.ContainsKey(countid)) countid++;
        call.callid = countid;
        callsort.Add(countid, call);
        return countid;
 
    }
    public static void ClearAll()
    {
 
        calltimes.Clear();
        callsort.Clear();
    }
    /// <summary>
    /// 删除延迟执行.
    /// </summary>
    /// <param name='call'>
    /// Call.
    /// </param>
    public static void remove(int callid)
    {
        if (callid > 0 && callsort.ContainsKey(callid))
        {
            CallObj call = callsort[callid];
            callsort.Remove(callid);
            if (call != null)
            {
                calltimes.Remove((CallTimeObj)call);
            }
        }
 
    }
 
    public static int AddTime(float delayTime, object arg, int repeat = 1,Action<object> call)
    {
        var callobj = new CallTimeObj();
        callobj.argsCall = call;
        callobj.arg = arg;
        callobj.repeat = repeat;
        callobj.time = Time.realtimeSinceStartup + delayTime;
        callobj.delayTime = delayTime;
        if (repeat == 0)
        {
            callobj.isloop = true;
        }
        calltimes.Add(callobj);
        getNewId(callobj);
        return callobj.callid;
 
    }
 
    /// <summary>
    /// 添加延迟执行
    /// </summary>
    /// <param name="call">回调方法</param>
    /// <param name="delayTime">延迟时间</param>
    /// <param name="repeat">重复回调次数</param>
    /// <param name="mn">承载回掉函数的实例是否存在的判断</param>
    /// <param name="isUnique">是否是唯一的方法</param>
    /// <param name="isReplace">如果重复是否覆盖</param>
    /// <returns></returns>
    public static int AddTime(float delayTime, int repeat = 1, MonoBehaviour mn = null, bool isUnique = false, bool isReplace = false,Action call)
    {
        if (isUnique)
        {
            for (int i = 0; i < calltimes.Count; i++)
            {
                CallTimeObj call2 = calltimes[i];
                if (call2.mn == mn && call2.call == call)
                {
                    if (isReplace)
                    {
                        call2.time = Time.realtimeSinceStartup + delayTime;
 
                    }
                    return call2.callid;
                }
            }
        }
 
        var callobj = new CallTimeObj();
        callobj.call = call;
        callobj.isMN = (mn != null);
        callobj.mn = mn;
        callobj.repeat = repeat;
        callobj.time = Time.realtimeSinceStartup + delayTime;
        callobj.delayTime = delayTime;
        if (repeat == 0)
        {
            callobj.isloop = true;
        }
        calltimes.Add(callobj);
        getNewId(callobj);
        return callobj.callid;
    }

(编辑:南平站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读