返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >unity实现延迟回调工具
  • 637
分享到

unity实现延迟回调工具

2024-04-02 19:04:59 637人浏览 薄情痞子
摘要

一个实用的计时器,可以计时延迟调用和延迟重复次数调用。 可以自己封装成单例模式挂在GameObject上使用,或者在另一个behavior的Update里执行这个类的OnUpdate

一个实用的计时器,可以计时延迟调用和延迟重复次数调用。

可以自己封装成单例模式挂在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;
    }


    public static void OnUpdate()
    {

        //time call
        if (calltimes.Count != 0) for (int i = 0; i < calltimes.Count; ++i)
            {
                CallTimeObj call = calltimes[i];
                if (call.time <= Time.realtimeSinceStartup)
                {
                    if (call.isloop == false)
                    {
                        call.repeat--;
                        if (call.repeat <= 0)
                        {
                            calltimes.RemoveAt(i);
                            callsort.Remove(call.callid);
                            --i;
                        }
                        else
                        {
                            //重新累加时间
                            call.time += call.delayTime;

                        }
                    }
                    else
                    {
                        call.time += call.delayTime;
                    }

                    if (!call.isMN || call.mn != null)
                    {
                        try
                        {
                            if (call.argsCall != null)
                            {
                                call.argsCall.Invoke(call.arg);
                                if (call.isloop == false)
                                {
                                    if (call.repeat <= 0)
                                    {
                                        call.arg = null;
                                        call.argsCall = null;
                                        call.mn = null;
                                    }
                                }
                            }
                            else
                            {
                                call.call();
                            }
                        }
                        catch (Exception e)
                        {
                            Debug.LogException(e);
                        }
                    }
                }
            }

    }
    private class CallObj
    {
        public Action call = null;
        public int frame;
        public bool isMN;
        public MonoBehaviour mn;
        public int callid = 0;
    }
    private class CallTimeObj : CallObj
    {
        public Action<object> argsCall = null;
        public float time;
        public int repeat = 1;
        public float delayTime = 0;
        public object arg;
        public bool isloop = false;
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: unity实现延迟回调工具

本文链接: https://lsjlt.com/news/136720.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • unity实现延迟回调工具
    一个实用的计时器,可以计时延迟调用和延迟重复次数调用。 可以自己封装成单例模式挂在GameObject上使用,或者在另一个behavior的Update里执行这个类的OnUpdate...
    99+
    2024-04-02
  • Unity实现毫秒延时回调功能
    简介 在项目的框架中看到了这个延迟回调的函数,一直以为是通过Unity协程实现的,最后看了源码后才发现是自己实现的。也是,如果用了协程成千上百个回调不得卡死。自己实现了一下核心的脚本...
    99+
    2024-04-02
  • Unity实现切割图集工具
    本文实例为大家分享了Unity实现切割图集工具的具体代码,供大家参考,具体内容如下 操作步骤 先将脚本拖入Editor 1.选中要切割的图片,texture type 选为defau...
    99+
    2024-04-02
  • python如何实现类似defer的延迟调用
    这篇文章给大家分享的是有关python如何实现类似defer的延迟调用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。实现类似 defer 的延迟调用在 Golang 中有一种延迟调用的机制,关键字是 defer,...
    99+
    2023-06-27
  • .Net实现延迟队列
    目录介绍使用场景方案Redis过期事件配置控制台订阅WebApi中订阅RabbitMq延迟队列生产消息消费消息其他方案介绍 具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就...
    99+
    2024-04-02
  • Jquery回调对象与延迟对象用法详解
    目录一、回调对象Callbacks1、定义和用法2、支持的 Flags 参数3、方法清单:二、延迟对象:deferred1、$.Deferred()定义和用法2、deferred.p...
    99+
    2024-04-02
  • Jquery回调对象与延迟对象怎么使用
    这篇文章主要介绍“Jquery回调对象与延迟对象怎么使用”,在日常操作中,相信很多人在Jquery回调对象与延迟对象怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Jquery回调对象与延迟对象怎么使用...
    99+
    2023-06-30
  • unity实现物体延时出现
    本文实例为大家分享了unity实现物体延时出现的具体代码,供大家参考,具体内容如下 新建一个cube和plane,隐藏cube,脚本挂在plane上。 1. update计时器实现 ...
    99+
    2024-04-02
  • 如何使用pt工具检测MySQL主从延迟
    小编给大家分享一下如何使用pt工具检测MySQL主从延迟,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   ...
    99+
    2024-04-02
  • 基于rabbitmq延迟插件实现分布式延迟任务
    目录一、延迟任务的使用场景二、组件安装三、RabbitMQ延迟队列插件的延迟队列实现1、基本原理2、核心组件开发走起之前给大家介绍过SpringBoot集成Redisson实现延迟队...
    99+
    2024-04-02
  • VuenextTick延迟回调获取更新后DOM机制详解
    目录简述事件循环机制vue数据驱动视图的处理(异步变化DOM)Vue.nextTick原理Vue.nextTick的应用created生命周期中操作DOM修改数据,获取DOM值简述 ...
    99+
    2022-11-13
    vue nextTick延迟回调DOM vue nextTick
  • golang函数中的延迟调用是如何实现的?
    golang 中函数延迟调用由 defer 关键字实现,该关键字将函数调用延迟到当前函数退出时执行。通过在栈中添加一个 defer 函数,存储延迟调用的函数和参数,确保退出函数后才调用延...
    99+
    2024-05-23
    golang 延迟调用
  • Unity实现简单的多人聊天工具
    本文实例为大家分享了Unity实现多人聊天工具的具体代码,供大家参考,具体内容如下 代码1 : 服务端代码 using UnityEngine; using System.Net.S...
    99+
    2024-04-02
  • Linux内核定时器与延迟工作怎么实现
    本篇内容介绍了“Linux内核定时器与延迟工作怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!内核定时器软件上的定时器最终要依靠硬件时...
    99+
    2023-06-16
  • Redis延迟队列和分布式延迟队列的简答实现
            最近,又重新学习了下Redis,Redis不仅能快还能慢,简直利器,今天就为大家介绍一下Redi...
    99+
    2024-04-02
  • 基于rabbitmq延迟插件怎么实现分布式延迟任务
    本文小编为大家详细介绍“基于rabbitmq延迟插件怎么实现分布式延迟任务”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于rabbitmq延迟插件怎么实现分布式延迟任务”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-06-26
  • Go+Redis实现延迟队列实操
    目录前言简单的实现定义消息PushConsume存在的问题多消费者实现定义消息PushConsume存在的问题总结前言 延迟队列是一种非常使用的数据结构,我们经常有需要延迟推送处理消...
    99+
    2024-04-02
  • 如何实现Redis延迟队列
    这期内容当中小编将会给大家带来有关如何实现Redis延迟队列,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。延迟队列,顾名思义它是一种带有延迟功能的消息队列。那么,是在什么...
    99+
    2024-04-02
  • Linq如何实现延迟加载
    小编给大家分享一下Linq如何实现延迟加载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linq延迟加载在查询某对象时,实际上你只查询该对象。不会同时自动获取这个...
    99+
    2023-06-17
  • Redis如何实现延迟队列
    目录Redis实现延迟队列Redis延迟队列Redis实现延时队列的优化方案延时队列的应用延时队列的实现总结Redis实现延迟队列 Redis延迟队列 Redis 是通过有序集合(ZSet)的方式来实现延迟消息队列的,Z...
    99+
    2023-04-28
    Redis延迟队列 Redis实现延迟队列 Redis队列
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作