Unity延時執(zhí)行的多種方法小結(jié)
最開始接觸unity的時候,我做延時都是在update里做計時器。后來才發(fā)現(xiàn),我屮艸芔茻,還有這么多種更方便延時執(zhí)行的方式?,F(xiàn)在我們就來捋一捋。
本文列舉的有以下四種,如有錯漏,歡迎補(bǔ)充指正
| ✨ | 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)時間達(dá)到預(yù)期,執(zhí)行需要延時的方法。 需要注意的是,增量時間Time.deltaTime是每幀都不同的浮點(diǎn)數(shù)。計時器不能用 == 去判斷達(dá)成條件。需要用 > 或 >= 加一個標(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 的一種委托機(jī)制。使用簡單便捷。 但是這個家伙和其他方式不太一樣的是,隱藏物體或?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固定時間,也可以延時固定幀。
點(diǎn)擊這里是一個協(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)文章
winform壁紙工具為圖片添加當(dāng)前月的日歷信息
使用用winform做了一個設(shè)置壁紙小工具,為圖片添加當(dāng)月的日歷并設(shè)為壁紙,可以手動/定時設(shè)置壁紙,最主要的特點(diǎn)是在圖片上生成當(dāng)前月的日歷信息,感興趣的你可以參考下2013-03-03

