Unity 延遲執行一段代碼的較為優雅的方式


在Unity中,延時執行一段代碼或者一個方法或者幾個方法的情況非常普遍。

一般會用到Invoke和InvokeRepeating方法。顧名思義,第一個是執行一次,第二個是重復執行。

看下定義:

void Invoke(string methodName, float time);

 

第一個參數是方法名(注意是字符串形式),並不是更方便的委托。第二個是延時多少秒。只執行一次。

void InvokeRepeating(string methodName, float time, float repeatRate);

 

InvokeRepeating第二個參數是延時多少秒后開始,第三個參數是每次執行間隔的秒數。

 

你有沒有發現這兩個方法有個弊端,就是必須輸入方法名!也就是我說,如果我想延時執行某段代碼,必須把代碼放在某個方法里,然后使用這Invoke或者InvokeRepeating方法來執行。

這樣對於上下文變量、屬性的引用就會尤為不便,而且不能傳參數!!!尼瑪,要他還有何用?

 

我猜你一定用過這樣的方法。沒錯,“協同”,聽起來還挺高大上的名字啊。

用StartCoroutine來執行一個以IEnumerator為返回值的方法,通常用於異步下載啊,等比較耗時又不能讓游戲卡死的情況。

還有一個好的類WaitForSeconds,對,它就一個構造函數,用來延時的(延時………………比萬艾可好用?比希愛力好用?)。

好了不廢話了,以下是我自用的延時方法,放在一個類里以靜態方法存在。可以在任何時候任何地方延時指定秒數的代碼。

using UnityEngine;
using System.Collections;
using System;

public class DelayToInvoke : MonoBehaviour
{

public static IEnumerator DelayToInvokeDo(Action action, float delaySeconds)
{
yield return new WaitForSeconds(delaySeconds);
action();
}
}

 

 

如何使用呢?

比如我點擊NGUI的一個Button,則

void OnClick()
{
StartCoroutine(DelayToInvoke.DelayToInvokeDo(() =>
{
Application.LoadLevel(“Option”);
}, 0.1f));
}

 

看到了吧

Application.LoadLevel(“Option”);就是想要延時執行的代碼段。

你可以寫很長很長。Action,隨便搞。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM