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