Unity實現(xiàn)毫秒延時回調(diào)功能
簡介
在項目的框架中看到了這個延遲回調(diào)的函數(shù),一直以為是通過Unity協(xié)程實現(xiàn)的,最后看了源碼后才發(fā)現(xiàn)是自己實現(xiàn)的。也是,如果用了協(xié)程成千上百個回調(diào)不得卡死。自己實現(xiàn)了一下核心的腳本,但是他的精華在于數(shù)據(jù)結(jié)構(gòu),把每個回調(diào)任務(wù)都做了很好的處理。
API
1: Time.deltaTime
實際上就是每幀所執(zhí)行的時間
功能實現(xiàn)
簡單的說一下功能的實現(xiàn),下面會直接貼出源碼。
每一個新增的任務(wù)(回調(diào))都會記錄創(chuàng)建任務(wù)的時間以及延遲的時間,以及自己的事件回調(diào)。通過每幀判斷當(dāng)前幀的時間是否大于創(chuàng)建的(任務(wù)的時間+延遲的時間)
代碼
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() { //測試--手動創(chuàng)建一個5秒后的回調(diào) if (Input.GetKeyDown(KeyCode.A)) { Tick tick = new Tick(() => { Debug.Log("任務(wù)執(zhí)行"); },5000,NOW); _ticks.Add(tick); } //每幀所使用的毫秒時間 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ù)的時間 public int currentTime { get; set; } //需要延遲的時間 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("時間還未到 "+ now); } } } }
待更新
核心的功能很簡單,但是最重要的是對tick的管理,不然每次遍歷所有的任務(wù)是非常耗費性能的,根據(jù)時間的長短放入到不同對list中,這也是后續(xù)待更的內(nèi)容。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
總結(jié)C#刪除字符串?dāng)?shù)組中空字符串的幾種方法
C#中要如何才能刪除一個字符串?dāng)?shù)組中的空字符串呢?下面的文章會介紹多種方式來實現(xiàn)清除數(shù)組中的空字符串,以及在.net中將字符串?dāng)?shù)組中字符串為空的元素去除。2016-08-08