Unity实现毫秒延时回调功能

简介

在项目的框架中看到了这个延迟回调的函数,一直以为是通过Unity协程实现的,最后看了源码后才发现是自己实现的。也是,如果用了协程成千上百个回调不得卡死。自己实现了一下核心的脚本,但是他的精华在于数据结构,把每个回调任务都做了很好的处理。

API

1: Time.deltaTime

实际上就是每帧所执行的时间

功能实现

简单的说一下功能的实现,下面会直接贴出源码。
每一个新增的任务(回调)都会记录创建任务的时间以及延迟的时间,以及自己的事件回调。通过每帧判断当前帧的时间是否大于创建的(任务的时间+延迟的时间)

代码

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

public class TickManager : MonoBehaviour
{
    // Start is called before the first frame update
    public int NOW;
    private List<Tick> _ticks = new List<Tick>();
    private void Update()
    {
        //测试--手动创建一个5秒后的回调
        if (Input.GetKeyDown(KeyCode.A))
        {
            Tick tick = new Tick(() =>
            {
                Debug.Log("任务执行");
            },5000,NOW);
            _ticks.Add(tick);
        }
        //每帧所使用的毫秒时间
        uint deltaTime = (uint)(Time.deltaTime * 1000);
        //遍历判断集合中的任务是否执行
        for (int i = 0; i < deltaTime; i++)
        {
            Debug.Log("帧数 " + NOW);

            for (int j = 0; j < _ticks.Count; j++)
            {
                _ticks[j].OnTick(NOW);
            }
            ++NOW;
        }

    }

    class Tick
    {
        //创建任务的时间
        public int currentTime { get; set; }
        //需要延迟的时间
        public int delayTime { get; set; }
        //延迟后的回调事件
        public Action action { get; set; }

        //构造函数--初始化
        public Tick(Action ac, int del, int now)
        {
            action = ac;
            delayTime = del;
            currentTime = now;
        }
        //判断该任务是否执行
        public void OnTick(int now)
        {
            if (now >= (currentTime + delayTime))
            {
                action();
            }
            else
            {
                Debug.Log("时间还未到 "+ now);
            }
        }
    }
}

待更新

核心的功能很简单,但是最重要的是对tick的管理,不然每次遍历所有的任务是非常耗费性能的,根据时间的长短放入到不同对list中,这也是后续待更的内容。

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

(0)

相关推荐

  • Unity封装延时调用定时器

    本文实例为大家分享了Unity封装延时调用定时器的具体代码,供大家参考,具体内容如下 封装一个延时调用定时器类 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class WaitTimeManager { private static TaskBehaviour m_Task; static WaitTimeManage

  • unity实现延迟回调工具

    一个实用的计时器,可以计时延迟调用和延迟重复次数调用. 可以自己封装成单例模式挂在GameObject上使用,或者在另一个behavior的Update里执行这个类的OnUpdate()方法再使用. 为了更加安全的使用,建议在销毁MonoBehaviour时清理一下对应的所有计时器. 或者调用时可选择传入回调所在的MonoBehaviour,这样就可以自动清理了. using System.Collections; using System; using System.Collections.G

  • Unity实现毫秒延时回调功能

    简介 在项目的框架中看到了这个延迟回调的函数,一直以为是通过Unity协程实现的,最后看了源码后才发现是自己实现的.也是,如果用了协程成千上百个回调不得卡死.自己实现了一下核心的脚本,但是他的精华在于数据结构,把每个回调任务都做了很好的处理. API 1: Time.deltaTime 实际上就是每帧所执行的时间 功能实现 简单的说一下功能的实现,下面会直接贴出源码. 每一个新增的任务(回调)都会记录创建任务的时间以及延迟的时间,以及自己的事件回调.通过每帧判断当前帧的时间是否大于创建的(任务的

  • 使用Python实现毫秒级抢单功能

    目录: 引言 环境 需求分析&前期准备 淘宝购物流程回顾 秒杀的实现 代码梳理 总结 0 引言 年中购物618大狂欢开始了,各大电商又开始了大力度的折扣促销,我们的小胖又给大家谋了一波福利,淘宝APP直接搜索:小胖发福利,每天领取三次粉丝专属现金大红包. 有了现金大红包,如何做到更省钱的剁手呢?今天给大家提供一种思路,用Python实现秒杀订单,借用自动化方式完成最优解. 1 环境 操作系统:Windows Python版本:3.7.2 2 需求分析&前期准备 2.0 需求分析 我们的目标

  • 利用AjaxSubmit()方法实现Form提交表单后回调功能

    1.      背景 最近在工作中,需要实现网页端图片上传到FTP服务器的功能.上传文件是用Form表单提交数据的方法向后台传输文件流,在此遇到了一个问题:后台在处理完图片上传功能后,需要向前台回传是否上传成功的状态码.上传失败的错误信息和上传成功后的图片URL.但是,用普通Form表单提交的话,没有办法实现回调函数.后来在小伙伴的介绍下,发现可以用ajaxSubmit()方法来实现此功能. 2.      ajaxSubmit()方法简介 (1)ajaxSubmit()依赖 ajaxSubmi

  • unity实现翻页按钮功能

    本文实例为大家分享了unity实现翻页按钮功能的具体代码,供大家参考,具体内容如下 效果图: UI子父级关系: 代码中也都有加入注释,有不懂可私信我.脚本中用到了对象池,我没有上传,可根据自己需求做相应变动. 脚本:PageBtnPanelC using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; /

  • unity实现物体延时出现

    本文实例为大家分享了unity实现物体延时出现的具体代码,供大家参考,具体内容如下 新建一个cube和plane,隐藏cube,脚本挂在plane上. 1. update计时器实现 using System.Collections; using System.Collections.Generic; using UnityEngine; //一个隐藏的物体等待t秒后显示,updata计时器实现 public class activeShow : MonoBehaviour { public Ga

  • Unity实现OCR文字识别功能

    首先登陆百度开发者中心,搜索文字识别服务: 创建一个应用,获取AppID.APIKey.SecretKey秘钥信息: 下载C# SDK,将AipSdk.dll动态库导入Unity: 本文以通用文字识别为例,查阅官方文档,以下是通用文字识别的返回数据结构: 在Unity中定义相应的数据结构: using System; /// <summary> /// 通用文字识别 /// </summary> [Serializable] public class GeneralOcr { //

  • python中实现延时回调普通函数示例代码

    前言 回调函数是我们在python编程中经常会遇到的一个问题,而想在将来某一时刻进行函数回调,可以使用call_later()函数来实现,第一个参数是回调用延时,第二个是回调的函数名称 例子如下: import asyncio def callback(n): print('callback {} invoked'.format(n)) async def main(loop): print('registering callbacks') loop.call_later(0.2, callba

  • Unity实现简易日志输出功能

    在使用Unity中的Debug.Log()进行日志输出时很不方便,在打包出来的可执行文件中没有办法看到输出,所有就想自己实现一个简易的日志输出功能,可以输出到日志文件,因为能力实在是不够,所以有错误和不合理的地方,还请各位老师指点一下,谢谢啦 1.日志记录器接口 public interface ILogger { void Log(string condition, string stackTrace, UnityEngine.LogType type); } 2.日志文件记录器 using

  • unity自定义弹出框功能

    本文实例为大家分享了unity自定义弹出框的具体方法,供大家参考,具体内容如下 一.弹出框的搭建 布局如图:Message为整个父物体,并且添加UiMessage代码.panel为遮罩. MessageBox为整个提示框,Panel为标题,ok为确定按钮,cancel为取消按钮,retry为重试按钮,Text为提示框的文字. 注意大小写,后面代码会根据名称进行获取对应组建. 效果如下: 二.MessageBox代码 要说明的都在代码中注释了.仿照Windows的提示框功能,如果功能不足可自行添加

  • Unity使用LineRender实现绘画功能

    本文实例为大家分享了Unity LineRender实现绘画功能的具体代码,供大家参考,具体内容如下 老规矩,直接上代码: using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class DrawLine_ZH : MonoBehaviour { private GameObject _Clone; private LineRenderer _Lin

随机推荐