Unity實(shí)現(xiàn)毫秒延時(shí)回調(diào)功能
簡(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)文章
C#實(shí)現(xiàn)多線程的Web代理服務(wù)器實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)多線程的Web代理服務(wù)器,涉及C#多線程代理服務(wù)器的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07總結(jié)C#刪除字符串?dāng)?shù)組中空字符串的幾種方法
C#中要如何才能刪除一個(gè)字符串?dāng)?shù)組中的空字符串呢?下面的文章會(huì)介紹多種方式來(lái)實(shí)現(xiàn)清除數(shù)組中的空字符串,以及在.net中將字符串?dāng)?shù)組中字符串為空的元素去除。2016-08-08C#實(shí)現(xiàn)萬(wàn)物皆可排序的隊(duì)列方法詳解
本文詳細(xì)講解了C#實(shí)現(xiàn)萬(wàn)物皆可排序隊(duì)列的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07C#中實(shí)現(xiàn)抽象類里建立靜態(tài)方法
這篇文章主要介紹了C#中實(shí)現(xiàn)抽象類里建立靜態(tài)方法,需要的朋友可以參考下2014-07-07C#窗體實(shí)現(xiàn)點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C#窗體實(shí)現(xiàn)點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08