Unity延時執行的多種方法小結

最開始接觸unity的時候,我做延時都是在update裡做計時器。後來才發現,我屮艸芔茻,還有這麼多種更方便延時執行的方式。現在我們就來捋一捋。

本文列舉的有以下四種,如有錯漏,歡迎補充指正

Update Invoke 協程 DoTween
支持參數傳入 ✖️ ✖️ ✔️ ✖️

下表是在不同情況下各方案的執行狀態

Update Invoke 協程 DoTween
Time.timeScale = 0 ✔️ ✖️ ✖️ ✔️
activeSelf == false ✖️ ✔️ ✖️ ✔️
enabled == false ✖️ ✔️ ✔️ ✔️
destroy ✖️ ✖️ ✖️ ✔️

Update計時器

在Update等刷新函數內計時,timer += Time.deltaTime 當時間達到預期,執行需要延時的方法。 需要註意的是,增量時間Time.deltaTime是每幀都不同的浮點數。計時器不能用 == 去判斷達成條件。需要用 > 或 >= 加一個標志位。以確保函數能執行到且隻執行一次 Update在 Time.timeScale = 0 時會正常執行,但這時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("執行測試函數");
    }

Invoke

Invoke() 方法是 Unity3D 的一種委托機制。使用簡單便捷。 但是這個傢夥和其他方式不太一樣的是,隱藏物體或將腳本enabled 設置為false,並不會中斷Invoke的執行。 Invoke支持重復調用: InvokeRepeating(“方法名”,延時時長,每次調用間隔時長)

 private float delayTime = 5;
    private void Start(){ 
        Invoke("DelayFunc",delayTime);
        //InvokeRepeating("DelayFunc",delayTime,cdTime);
    }
    private void DelayFunc(){
        print("執行測試函數");
    }

協程

協程本質是迭代器,寫法麻煩,但很好用。可以延時固定時間,也可以延時固定幀。
點擊這裡是一個協程的管理類,支持暫停繼續等功能

  private float timer = 0;
    private void Start()
    {
        StartCoroutine("DelayFunc");
        Time.timeScale = 0;
    }
    IEnumerator DelayFunc()
    {
        while ( timer < 30)
        {
            yield return new WaitForSeconds(1);
            timer++;
            print("執行測試函數"+timer); 
        }
    }

DoTween

如果你使用UGUI,那麼你一定知道DoTween。DoTween是很常用的簡單動畫插件,但有時候我們能用它來做一些奇怪的操作。比如延時函數 執行後隻能通過 seq.Pause();seq.Kill();等自帶函數關閉。 Time.timeScale = 0,隱藏物體,禁用腳本,刪除物體等情況下,均繼續執行方法。

 private void Start()
    {
        seq = DOTween.Sequence();
        seq.AppendInterval(5);
        seq.AppendCallback(DelayFunc);
        seq.SetAutoKill(false);
        seq.SetUpdate(true);//設為true時可在Time.timeScale=0的情況下正常執行
        
    }
    void DelayFunc()
    {
        print("執行測試函數"); 
    }

到此這篇關於Unity延時執行的多種方法小結的文章就介紹到這瞭,更多相關Unity延時執行內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: