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