日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产麻豆电影在线观看 | 成人学院中文字幕 | 国产偷拍一区二区三区 | 欧美在线观看免费高清 | 一卡二卡三卡视频 | 在线不卡视频 | 日韩一区二区三区不卡视频 | 欧美精品一区二区不卡 | 日韩免费中文字幕 | 国产精品日韩欧美大师 | 亚洲一区二区免费在线观看 | 最新国产网址 | 波多野结衣亚洲 | 丁香六月久久 | 韩国成人在线视频 | 麻豆chinese新婚xxx | 91一区二区三区在线 | 欧美日韩卡一卡二 | 国产日韩中文字幕 | 双性人妖互交localhost | 国产精品美女毛片真酒店 | 麻豆一二三区 | 国产精品海角社区 | 人乳videos巨大吃奶 | 国产精品久久伊人 | 精品国产欧美一区二区三区成人 | 日韩精品国产一区 | 日本爱爱免费视频 | 午夜久久久 | 99久久久无码国产精品性青椒 | 色吧久久 | 久久字幕| 强侵犯の奶水授乳羞羞漫虐 | 亚洲av永久无码国产精品久久 | 超碰v| 熟女熟妇伦久久影院毛片一区二区 | 韩国av不卡 | 成人精品久久久 | 华人永久免费视频 | 欧美日韩一二 | 91视频免费看 | 激情伊人| 久久影音| av一本二本 | 天天操天天干天天干 | 日韩小视频网站 | 国产精品ww | 久久久久久人妻一区二区三区 | 啪啪影音 | 四虎视频在线观看 | 91精品一区二区三区综合在线爱 | 快射视频在线观看 | 偷偷在线观看免费高清av | 亚洲国产97在线精品一区 | 国产免费网| 国产综合av| 国产天堂在线观看 | 天堂一区二区三区 | 人操人 | 黄色成年人视频 | 日韩毛片基地 | 黄色69| 国产调教 | 黄色免费片 | 日本a级片免费 | 成人aaa视频| 狗爬女子的视频 | 99r在线视频| 玖玖在线免费视频 | 亚洲精品国产精品乱码不99热 | 久草午夜 | 亚洲色图在线观看视频 | 欧美成人激情 | 操丝袜美女视频 | 女优视频在线观看 | 欧美黑人做爰爽爽爽 | 性欧美在线视频观看 | 超清av在线 | 国产成人无码精品久久二区三 | 亚洲视频图片 | 亚洲a v网站| 日韩精品一区二区三区在线视频 | 欧美性猛交xxxx乱大交3 | 夜夜爽妓女8888视频免费观看 | 天天激情综合 | 99爱在线 | 国产三级一区二区三区 | 久久久久久久无码 | 红桃成人网 | 久久国产乱子 | 毛片视频观看 | 高清一区二区三区四区五区 | 欧美精品乱码视频一二专区 | 黄色a站| www.国产一区二区 | 日韩午夜视频在线观看 | 黄色一级片av | 久久国产情侣 | 天天干,天天爽 |