1. 程式人生 > >Unity 延遲執行一段程式碼的實現比較好的方式

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,隨便搞。

相關推薦

Unity 延遲執行程式碼實現比較方式

在Unity中,延時執行一段程式碼或者一個方法或者幾個方法的情況非常普遍。 一般會用到Invoke和InvokeRepeating方法。顧名思義,第一個是執行一次,第二個是重複執行。 看下定義: void Invoke(string methodName, float time);   第一個引數是方法名(

Unity延遲執行程式碼的較為優雅的方式

=============================================== using UnityEngine;using System.Collections;using System; public class DelayToInvoke :Mo

springboot專案啟動成功後執行程式碼的兩種方式

springboot專案啟動成功後執行一段程式碼的兩種方式   實現ApplicationRunner介面 package com.lnjecit.lifecycle; import org.springframework.boot.ApplicationArguments; i

每月初執行程式碼

每個月月初的時候需要執行一段程式碼,在網上看到最好直接用quartz,但覺得還是需要導包,嫌麻煩。和朋友研究了一下最後又這個這種寫法。 import java.util.Date; import ja

js迴圈中延遲幾秒執行程式碼

原因:由於js程式碼執行策略是幾段程式碼可以同時執行,而不是先等上一句執行完再執行下一句。 原理:假設有兩段程式碼需要先走執行,先執行程式碼片段1再執行程式碼片段2。那麼程式碼2必須在程式碼1中執行。 專案場景:ajax獲得了多條提示資訊,需要頁面逐一自定義彈框顯示出來,這

java設定程式碼執行的超時時間的簡單方法 間接實現獲取Connection超時問題

最近有個需求, 當DB壓力過大時獲取Connction的時間過慢長時間不返回的話, 就不連線DB了, 研究了好久,DataSource裡面的setLoginTimeOut 根本沒法用, 剛開始一直糾結在大google搜尋"java get connection 超時"答案上

[轉載]用verilog寫程式碼實現消除一個glitch

  濾掉小於1個週期glitch的原理圖如下:   verilog程式碼實現如下: module digital_filter_(clk_in,rst,host_rst,host_rst_filter); input clk_in; input rst; i

用winform實現的類似於WPF中PopUp控制元件的程式碼

用winform實現的類似於WPF中PopUp控制元件的一段程式碼 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using Syste

使程式碼第一次執行和以後執行結果不同

在學習《C專家程式設計》時,遇到了這段程式碼非常的有意思。 void generate_initializer(char * string) { static char separator = ' '; printf(" %c %s \n",separator,stri

用python實現程式碼,它的功能是將自己列印

今天看到一道有趣的面試題,用python實現一段程式碼,然後將自己列印,其實很簡單 import sys   首先匯入 sys 模組 f_name = sys.argv[0]              sys.argv[ ]第一個元素是程式本身,sys.argv[0] 

java多執行緒3:關鍵字synchronized取得的鎖都是物件鎖,而不是把程式碼或者方法(函式)當作鎖

java多執行緒3:關鍵字synchronized取得的鎖都是物件鎖,而不是把一段程式碼或者方法(函式)當作鎖 a.當多個執行緒訪問同一個物件的時候,哪個執行緒先執行帶synchronized關鍵字的方法,哪個執行緒就該方法所屬物件的鎖Lock,那麼其他物件就智慧呈等待狀態。但是如果多個執行緒訪

Swift中計算程式碼執行時間

最近在做專案優化,其中有一個介面滑動有些卡頓,於是想找到哪段程式碼執行時間過長。用下面的方法即可:let startTime = CFAbsoluteTimeGetCurrent() //要執行的程式碼 //...let endTime = CFAbsoluteTimeGet

用Python寫程式碼實現接收使用者輸入兩個的數字並輸出數字相加後的結果,要求使用者輸入任何內容程式不會報錯

分別採用基礎方法和異常處理方法實現。 基礎方法程式碼如下: num1 = input('請輸入數字1:') if num1.strip() == '': print('輸入錯誤。') exit() elif num1[0] != '.': for

Android迴圈執行程式碼

方法一:Handler.postDelayed實現 1、執行迴圈的函式如下: private Handler handler = new Handler(); private Runnable task = new Runnable() {

apk安裝法之二----Android實現應用下載並自動安裝apk包的程式碼

protected File downLoadFile(String httpUrl) { // TODO Auto-generated method stub final String fileName = "updata.apk";

iOS 如何檢視程式碼執行的時間

http://www.jianshu.com/p/221507eb8590?utm_source=open-open     ios開發的一些小技巧篇一 1.如何快速的檢視一段程式碼的執行時間。 #define TICK NSDate *startTime = [NS

在Android Studio中測試程式碼執行結果

檢測一段很小的程式碼,不一定需要讓整個專案跑起來,可以通過簡單的方式看下寫的效果。 1、 public static void main(String[] args){ //下面寫你要測試的方法,如: String aaa = "aaa"; Str

Qt中計算程式碼執行時間

利用gettimeofday(),其精度為us級 #include <QDebug> #include <sys/time.h> struct timeval tpstart,tpend;   float timeuse;   gettime

iOS 計算程式碼執行的時間

NSDate* Start = [NSDate date]; 上面這段程式碼放是放在從哪裡開始計時 double deltaTime = [[NSDate date] timeIntervalSinceDate:Start]; NSLog(@”*

java設定程式碼執行的超時時間的簡單方法

最近有需求說設定es搜尋查詢不能超時配置檔案的毫秒數,所以正好使用的ExecutorService類,下面就 ExecutorService使用做記錄: ResultData resultData