日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity3d通用工具类之定时触发器

發(fā)布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity3d通用工具类之定时触发器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

時隔多日,好不容易擠出點時間來寫寫博文。不容易,請送我?guī)锥浼t花,點個贊也行。

?

今天呢,我們主要來擴展下通用工具類==>定時觸發(fā)器。

?

顧名思義,所謂的定時觸發(fā)器,就是告訴程序在過多長時間后,我要執(zhí)行某個特定的任務(wù)。

?

比如舉個小栗子:

電飯煲,相信大家都用過,當(dāng)我們出去工作或者上學(xué)的時候,我們只要設(shè)置下煮飯時間,就可以安心的離開。

?

電飯煲會自動的開始計時工作,等到了你設(shè)置的時間后,他就會自動的開始煮飯啊什么的。而你卻可以在遠(yuǎn)在千里的上班。

?

智能化,對就是這樣的效果。我們今天就來寫寫這個智能的小東西。

?

首先在設(shè)計這個小功能之前,我們要明白自己需要的是什么?如何設(shè)計?

?

1.需要什么:

(1)肯定要有個管理定時器的類,命名TimeTaskManager。(上網(wǎng)查了下定時器英文可以為:TimeTask,所以就取了這個名字)

(2)既然有了這個管理類,那么這個管理類要管理什么東西?對嘍,是你所要定時執(zhí)行的任務(wù)。那么這個任務(wù)要包含什么東西?

    1.多久時間開始執(zhí)行任務(wù)肯定要,

    2.重復(fù)執(zhí)行間隔(有些任務(wù)要定時的重復(fù)執(zhí)行,比如像機器加工廠的機器晝夜重復(fù)一個加工動作)

ok,我們命名為TimeTask

?

2.如何設(shè)計:

當(dāng)我們設(shè)計一個個有相關(guān)聯(lián)的類的時候,我們可能需要紙筆來打草稿,其實完全不用,學(xué)過uml的同學(xué)可以新手拈來。這里呢我推薦使用Process On這個工具。在線繪畫工具,非常好用。

這里我們邊設(shè)計邊畫圖:

首先從TimeTask下手,對于這個類,我們要想作為一個任務(wù),而且還是定時的。那么一下就能想到,任務(wù)執(zhí)行用委托。還有程序肯定有許多任務(wù),所以要定義一個id識別這個唯一任務(wù)。

那么定時肯定也需要一些變量,

  1.private uint id;//任務(wù)id

  2.private uint interval;//間隔多少秒,重復(fù)這個任務(wù)

  3.private Action action;//無參委托

看到這里,這個Timetask任務(wù)類,大致建立好了。

?

哎!細(xì)心的同學(xué)可能會發(fā)現(xiàn),這個Action委托是個無參委托,那么假如說我的任務(wù)方法有帶參的怎么辦呢?哎,那么問題就來了。

?

那么我再設(shè)計一個帶一個參數(shù)的Timetask<T>類,然后Action<T> action不就行了。那二個參數(shù)呢,三個參數(shù)呢......?

?

有多少個參數(shù),你都要設(shè)計多少個類。

?

所以,對于這樣的情況,我們需要把Timetask抽象成一個基類,命名為AbstractTimeTask

?

?

哎!只要我們所有無參帶參的TimeTask都繼承與AbstractTimeTask抽象類,這樣代碼的復(fù)用性就大大提高了。

設(shè)計好了之后,我們編寫代碼:

?

?

AbstractTimeTask:

using UnityEngine; using System.Collections; using System; #region 模塊信息 /*---------------------------------------------------------------- // 模塊名:AbstractTimeT // 創(chuàng)建者:chen // 修改者列表: // 創(chuàng)建日期:2015.11.5 // 模塊描述//----------------------------------------------------------------*/ #endregion public abstract class AbstractTimeTask {#region 字段private uint m_uiTimeId;//任務(wù)idprivate int m_iInterval;//任務(wù)重復(fù)時間間隔,為0不重復(fù)private ulong m_ulNextTick;//下一次觸發(fā)的時間點#endregion#region 屬性public uint TimeId{get {return m_uiTimeId;}set {m_uiTimeId = value;}}public int Interval {get { return m_iInterval; }set { m_iInterval = value; }}public ulong NextTick {get{return m_ulNextTick;}set {this.m_ulNextTick = value;}}/// <summary>/// 抽象屬性,給子類自定義自己的action委托/// </summary>public abstract Action Action{get;set;}#endregion#region 公有方法/// <summary>/// 抽象方法,給自己自己定義執(zhí)行委托/// </summary>public abstract void DoAction();#endregion }

TimeTask:(這里主要先講無參)

using UnityEngine; using System.Collections; using System; #region 模塊信息 /*---------------------------------------------------------------- // 模塊名:TimeTask // 創(chuàng)建者:chen // 修改者列表: // 創(chuàng)建日期:2015.11.5 // 模塊描述:定時觸發(fā)任務(wù)類 //----------------------------------------------------------------*/ #endregion public class TimeTask : AbstractTimeTask {#region 字段private Action m_action;//定義自己的委托#endregion#region 屬性public override Action Action{get{return m_action;}set{m_action = value;}}#endregion#region 公有方法/// <summary>/// 重新父類的委托方法/// </summary>public override void DoAction(){m_action();}#endregion }

  

這里我們增加了NextTick字段,有什么卵用呢?主要是用來與當(dāng)前程序運行時間比較,如果剛好等于這個NextTick值時,就觸發(fā)委托函數(shù),執(zhí)行任務(wù)。

細(xì)想一下,我們定時管理器類要把任務(wù)一個個加到隊列里面管理,那么肯定需要一個時間變量與task里面的時間變量進(jìn)行比較。

所以,定時管理類就需要一個static uint tick變量來記錄程序運行總的時間,如果吧task加到隊列里面,task的NextTick=程序運行的總的時間tick+start(多久之后執(zhí)行任務(wù));還有就是如果task的interval的值大于0,也就是說有重復(fù)的執(zhí)行,那么,就需要再加上interval的值,然后再加入到隊列里面。

分析了這么多,接著來寫管理類:

TimeTaskManager:

using UnityEngine; using System.Collections.Generic; using System.Diagnostics; using System; #region 模塊信息 /*---------------------------------------------------------------- // 模塊名:TimeTaskManager // 創(chuàng)建者:chen // 修改者列表: // 創(chuàng)建日期:2015.11.5 // 模塊描述:定時觸發(fā)器管理類 //----------------------------------------------------------------*/ #endregion public class TimeTaskManager {#region 字段private static uint m_uiNextTimeId;//總的id,需要分配給task,也就是每加如一個task,就自增private static uint m_uiTick;//總的時間,用來和task里面的nexttick變量來進(jìn)行比較,看是否要觸發(fā)任務(wù)private static Queue<AbstractTimeTask> m_queue;private static Stopwatch m_stopWatch;//c#自帶的計時器,不會的自行百度private static readonly object m_queueLock = new object();//隊列鎖#endregion#region 構(gòu)造方法private TimeTaskManager(){}static TimeTaskManager(){m_queue = new Queue<AbstractTimeTask>();m_stopWatch = new Stopwatch();}#endregion#region 公有方法/// <summary>/// 吧Task加入到隊列里面來管理,既然是個管理器肯定要有個添加task的操作/// </summary>/// <param name="start">多久之后開始執(zhí)行ms</param>/// <param name="interval">重復(fù)時間間隔ms</param>/// <param name="action">任務(wù)委托</param>/// <returns>任務(wù)id</returns>public static uint AddTimer(uint start, int interval, Action action){AbstractTimeTask task = GetTimeTask(new TimeTask(), start, interval, action);lock (m_queueLock){m_queue.Enqueue(task);}return task.TimeId;}/// <summary>/// 周期性執(zhí)行/// </summary>public static void Tick(){TimeTaskManager.m_uiTick += (uint)(m_stopWatch.ElapsedMilliseconds);//nityEngine.Debug.Log(TimeTaskManager.m_uiTick);m_stopWatch.Reset();m_stopWatch.Start();while (m_queue.Count != 0){AbstractTimeTask task;lock (m_queueLock){task = m_queue.Peek();//這里注意隊列并沒有刪除元素,只是放回元素,元素還在隊列里面}if (TimeTaskManager.m_uiTick < task.NextTick)//如果程序的總時間小于task要執(zhí)行的時間點,就break點,繼續(xù)等待{break;}lock (m_queueLock){m_queue.Dequeue();}if (task.Interval > 0)//如果需要重復(fù)的話{task.NextTick += (ulong)task.Interval;lock (m_queueLock){m_queue.Enqueue(task);//再次加入隊列里面,注意哦,id不變的}task.DoAction();}else {task.DoAction();//執(zhí)行委托}}}#endregion#region 私有方法private static AbstractTimeTask GetTimeTask(AbstractTimeTask task,uint start,int interval,Action action) {task.Interval = interval;task.TimeId = ++TimeTaskManager.m_uiNextTimeId;task.NextTick = TimeTaskManager.m_uiTick + start;task.Action = action;return task;}#endregion }

 注意:AddTimer的參數(shù)的單位是毫秒,不是秒。

接下來是實驗:

首先寫個Driver,作為驅(qū)動類。

using UnityEngine; using System.Collections; #region 模塊信息 /*---------------------------------------------------------------- // 模塊名:Driver // 創(chuàng)建者:chen // 修改者列表: // 創(chuàng)建日期:2015.11.5 // 模塊描述:驅(qū)動類 //----------------------------------------------------------------*/ #endregion public class Driver : MonoBehaviour {void Start(){TimeTaskManager.AddTimer(5000, 5000, DebugTest);InvokeRepeating("Tick", 0, 0.02f);}void Update(){}void Tick(){TimeTaskManager.Tick();}void DebugTest(){Debug.Log("111");} }

 創(chuàng)建一個空物體,然后賦予它這個腳本,作為驅(qū)動所有程序腳本。

運行,發(fā)現(xiàn)程序在5秒之后,每隔5秒打印一個111到控制臺。

這個定時類,非常的有用,就比如說網(wǎng)絡(luò)通信啊,我們可以定時的發(fā)送心跳包,還有彈出警告窗口,計時多少秒之后自動關(guān)閉等等

?

轉(zhuǎn)載于:https://www.cnblogs.com/CaomaoUnity3d/p/4940655.html

總結(jié)

以上是生活随笔為你收集整理的Unity3d通用工具类之定时触发器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av性天堂网 | 国产欧美日韩精品一区 | 制服丝袜手机在线 | 色中文字幕 | 少妇三级全黄 | 在线看成人 | 伊人网大香 | 日本不卡视频一区 | 涩涩涩在线视频 | 国产91精品在线观看 | 日日夜夜av | 亚洲国产精品二区 | 成人美女免费网站视频 | 久久久久香蕉视频 | 欧美综合亚洲图片综合区 | 国产精品国产一区二区 | 本庄优花番号 | 午夜久久一区 | 成人免费毛片足控 | 国产三级日本三级在线播放 | 日韩网站视频 | 久久国产精品无码一区二区 | 人操人 | 色婷婷国产精品综合在线观看 | 久久午夜精品人妻一区二区三区 | 在线观看二区 | 欧美看片| 中文字幕一区二区三区四区欧美 | 国产日本欧美在线观看 | 黄色在线观看国产 | 亚洲国语| 中文无码一区二区三区在线观看 | 97狠狠| 国产自产在线视频 | 国产高清视频网站 | 粉嫩视频在线观看 | 欧美一级二级片 | 国内偷拍一区 | www.777奇米 | 久久久久久久久久一区二区 | 日本黄色小片 | 美女脱了裤子让男人桶 | 污污在线看 | 中文字幕五码 | 丁香六月激情综合 | 先锋影音av资源网 | 在线精品一区 | 高潮av| 中文字幕在线视频播放 | 欧美激情欧美激情在线五月 | 公交顶臀绿裙妇女配视频 | 日本午夜视频在线观看 | 日韩中文字幕一区二区三区四区 | 亚洲最大在线视频 | 国内成人免费视频 | 大奶在线播放 | 在线观看网站污 | 91看片免费 | 日韩首页 | 九九九九九精品 | 精品一区二区久久久久久久网站 | 亚洲精品国产精品国自产网站 | 国产成人精品无码免费看在线 | 日本大乳奶做爰 | 日本熟妇一区二区三区 | 人人看人人草 | 国产美女喷水视频 | 午夜福利三级理论电影 | 国产a级网站 | 五月天中文字幕在线 | 日本黄色aaa | 18欧美性xxxx极品hd | 超碰www| 男人天堂免费视频 | 啦啦啦免费高清视频在线观看 | www.男人的天堂.com | 国产美女菊爆在线播放APP | 欧美一二 | 蜜芽在线视频 | 白石茉莉奈番号 | 在线欧美亚洲 | 久久久在线免费观看 | 又粗又猛又爽又黄的视频 | 黄色成年网站 | 午夜精品一区二区三区在线播放 | 伊人精品| 免费在线一区二区 | 美梦视频大全在线观看高清 | 亚洲 小说 欧美 激情 另类 | 亚洲一级影片 | 精品人妻伦一二三区久久 | 欧美xxxxav | 国产激情综合五月久久 | 久久久精品久久 | 九色视频网 | 亚洲中文一区二区三区 | 久久国产色av | 精品国产免费人成在线观看 | 亚欧美色图 |