亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Unity實(shí)現(xiàn)毫秒延時(shí)回調(diào)功能

 更新時(shí)間:2021年09月26日 09:56:28   作者:做一個(gè)愛學(xué)習(xí)的可愛同學(xué)  
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)毫秒延時(shí)回調(diào)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

簡(jiǎn)介

在項(xiàng)目的框架中看到了這個(gè)延遲回調(diào)的函數(shù),一直以為是通過(guò)Unity協(xié)程實(shí)現(xiàn)的,最后看了源碼后才發(fā)現(xiàn)是自己實(shí)現(xiàn)的。也是,如果用了協(xié)程成千上百個(gè)回調(diào)不得卡死。自己實(shí)現(xiàn)了一下核心的腳本,但是他的精華在于數(shù)據(jù)結(jié)構(gòu),把每個(gè)回調(diào)任務(wù)都做了很好的處理。

API

1: Time.deltaTime

實(shí)際上就是每幀所執(zhí)行的時(shí)間

功能實(shí)現(xiàn)

簡(jiǎn)單的說(shuō)一下功能的實(shí)現(xiàn),下面會(huì)直接貼出源碼。
每一個(gè)新增的任務(wù)(回調(diào))都會(huì)記錄創(chuàng)建任務(wù)的時(shí)間以及延遲的時(shí)間,以及自己的事件回調(diào)。通過(guò)每幀判斷當(dāng)前幀的時(shí)間是否大于創(chuàng)建的(任務(wù)的時(shí)間+延遲的時(shí)間)

代碼

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()
    {
        //測(cè)試--手動(dòng)創(chuàng)建一個(gè)5秒后的回調(diào)
        if (Input.GetKeyDown(KeyCode.A))
        {
            Tick tick = new Tick(() =>
            {
                Debug.Log("任務(wù)執(zhí)行");
            },5000,NOW);
            _ticks.Add(tick);
        }
        //每幀所使用的毫秒時(shí)間
        uint deltaTime = (uint)(Time.deltaTime * 1000);
        //遍歷判斷集合中的任務(wù)是否執(zhí)行
        for (int i = 0; i < deltaTime; i++)
        {
            Debug.Log("幀數(shù) " + NOW);

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


    class Tick
    {
        //創(chuàng)建任務(wù)的時(shí)間
        public int currentTime { get; set; }
        //需要延遲的時(shí)間
        public int delayTime { get; set; }
        //延遲后的回調(diào)事件
        public Action action { get; set; }

        //構(gòu)造函數(shù)--初始化
        public Tick(Action ac, int del, int now)
        {
            action = ac;
            delayTime = del;
            currentTime = now;
        }
        //判斷該任務(wù)是否執(zhí)行
        public void OnTick(int now)
        {
            if (now >= (currentTime + delayTime))
            {
                action();
            }
            else
            {
                Debug.Log("時(shí)間還未到 "+ now);
            }
        }
    }
}

待更新

核心的功能很簡(jiǎn)單,但是最重要的是對(duì)tick的管理,不然每次遍歷所有的任務(wù)是非常耗費(fèi)性能的,根據(jù)時(shí)間的長(zhǎng)短放入到不同對(duì)list中,這也是后續(xù)待更的內(nèi)容。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論