IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity功能之毫秒延时回调 -> 正文阅读

[游戏开发]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中,这也是后续待更的内容。
不过目前的主线是在学数据结构所以这段先放一放,如果亲们需要可以评论一下,我尽快更上去.

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-26 10:31:04  更:2021-09-26 10:31:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 3:38:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码