Unity延時(shí)執(zhí)行的多種方法小結(jié)
最開始接觸unity的時(shí)候,我做延時(shí)都是在update里做計(jì)時(shí)器。后來才發(fā)現(xiàn),我屮艸芔茻,還有這么多種更方便延時(shí)執(zhí)行的方式?,F(xiàn)在我們就來捋一捋。
本文列舉的有以下四種,如有錯(cuò)漏,歡迎補(bǔ)充指正
✨ | Update | Invoke | 協(xié)程 | DoTween |
支持參數(shù)傳入 | ✖️ | ✖️ | ✔️ | ✖️ |
下表是在不同情況下各方案的執(zhí)行狀態(tài)
✨ | Update | Invoke | 協(xié)程 | DoTween |
Time.timeScale = 0 | ✔️ | ✖️ | ✖️ | ✔️ |
activeSelf == false | ✖️ | ✔️ | ✖️ | ✔️ |
enabled == false | ✖️ | ✔️ | ✔️ | ✔️ |
destroy | ✖️ | ✖️ | ✖️ | ✔️ |
Update計(jì)時(shí)器
在Update等刷新函數(shù)內(nèi)計(jì)時(shí),timer += Time.deltaTime 當(dāng)時(shí)間達(dá)到預(yù)期,執(zhí)行需要延時(shí)的方法。 需要注意的是,增量時(shí)間Time.deltaTime是每幀都不同的浮點(diǎn)數(shù)。計(jì)時(shí)器不能用 == 去判斷達(dá)成條件。需要用 > 或 >= 加一個(gè)標(biāo)志位。以確保函數(shù)能執(zhí)行到且只執(zhí)行一次 Update在 Time.timeScale = 0 時(shí)會(huì)正常執(zhí)行,但這時(shí)Time.deltaTime的值為0。需要這時(shí)使用計(jì)時(shí)器的話,可以使用Time.realtimeSinceStartup
private float delayTime = 1; private float timer = 0; private bool executed = false; void Update(){ if (executed == false){ timer += Time.deltaTime; if (timer >= 1){ executed = true; DelayFunc(); } } } private void DelayFunc(){ print("執(zhí)行測(cè)試函數(shù)"); }
Invoke
Invoke() 方法是 Unity3D 的一種委托機(jī)制。使用簡(jiǎn)單便捷。 但是這個(gè)家伙和其他方式不太一樣的是,隱藏物體或?qū)⒛_本enabled 設(shè)置為false,并不會(huì)中斷Invoke的執(zhí)行。 Invoke支持重復(fù)調(diào)用: InvokeRepeating("方法名",延時(shí)時(shí)長(zhǎng),每次調(diào)用間隔時(shí)長(zhǎng))
private float delayTime = 5; private void Start(){ Invoke("DelayFunc",delayTime); //InvokeRepeating("DelayFunc",delayTime,cdTime); } private void DelayFunc(){ print("執(zhí)行測(cè)試函數(shù)"); }
協(xié)程
協(xié)程本質(zhì)是迭代器,寫法麻煩,但很好用??梢匝訒r(shí)固定時(shí)間,也可以延時(shí)固定幀。
點(diǎn)擊這里是一個(gè)協(xié)程的管理類,支持暫停繼續(xù)等功能
private float timer = 0; private void Start() { StartCoroutine("DelayFunc"); Time.timeScale = 0; } IEnumerator DelayFunc() { while ( timer < 30) { yield return new WaitForSeconds(1); timer++; print("執(zhí)行測(cè)試函數(shù)"+timer); } }
DoTween
如果你使用UGUI,那么你一定知道DoTween。DoTween是很常用的簡(jiǎn)單動(dòng)畫插件,但有時(shí)候我們能用它來做一些奇怪的操作。比如延時(shí)函數(shù) 執(zhí)行后只能通過 seq.Pause();seq.Kill();等自帶函數(shù)關(guān)閉。 Time.timeScale = 0,隱藏物體,禁用腳本,刪除物體等情況下,均繼續(xù)執(zhí)行方法。
private void Start() { seq = DOTween.Sequence(); seq.AppendInterval(5); seq.AppendCallback(DelayFunc); seq.SetAutoKill(false); seq.SetUpdate(true);//設(shè)為true時(shí)可在Time.timeScale=0的情況下正常執(zhí)行 } void DelayFunc() { print("執(zhí)行測(cè)試函數(shù)"); }
到此這篇關(guān)于Unity延時(shí)執(zhí)行的多種方法小結(jié)的文章就介紹到這了,更多相關(guān)Unity延時(shí)執(zhí)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# Chart折線圖使用鼠標(biāo)滾輪放大、縮小和平移曲線方式
這篇文章主要介紹了C# Chart折線圖使用鼠標(biāo)滾輪放大、縮小和平移曲線方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06C#實(shí)現(xiàn)導(dǎo)入CSV文件到Excel工作簿的方法
這篇文章主要介紹了C#實(shí)現(xiàn)導(dǎo)入CSV文件到Excel工作簿的方法,涉及C#針對(duì)office組件的相關(guān)操作技巧,需要的朋友可以參考下2015-06-06C#?設(shè)置Chart的X軸為時(shí)間軸???????詳情
這篇文章主要介紹了C#設(shè)置Chart的X軸為時(shí)間軸???????詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08WinForm使用正則表達(dá)式提取內(nèi)容的方法示例
這篇文章主要介紹了WinForm使用正則表達(dá)式提取內(nèi)容的方法,結(jié)合實(shí)例形式分析了WinForm基于正則匹配獲取指定內(nèi)容的相關(guān)操作技巧,需要的朋友可以參考下2017-05-05基于C#實(shí)現(xiàn)的多生產(chǎn)者多消費(fèi)者同步問題實(shí)例
這篇文章主要介紹了基于C#實(shí)現(xiàn)的多生產(chǎn)者多消費(fèi)者同步問題,包括了加鎖與釋放鎖,以及對(duì)應(yīng)臨界資源的訪問。是比較實(shí)用的技巧,需要的朋友可以參考下2014-09-09算法證明每一位都相同十進(jìn)制數(shù)不是完全平方數(shù)
這篇文章主要為大家介紹了算法證明每一位都相同十進(jìn)制數(shù)不是完全平方數(shù)的過程論述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05