unity完成延迟回调工具
发布时间:2021-11-12 18:35:18 所属栏目:教程 来源:互联网
导读:一个实用的计时器,可以计时延迟调用和延迟重复次数调用。 可以自己封装成单例模式挂在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; } (编辑:阜新站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |