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

