unity學習筆記-C#協程
unity3D是單執行緒,因此需要協程機制來實現一些類似於多執行緒的功能,但要明確協程不是程式或執行緒,其執行過程類似於子例程,或者說不帶返回值的函式呼叫。
- 開啟協程
StartCoroutine方法是Mono中定義的一個靜態方法,有兩個過載版本:
Coroutine StartCoroutine(IEnumerator routine);
Coroutine StartCoroutine(string methonName, Object obj = null);
下面來看簡單的例子:
public class ExampleTest : MonoBehaviour {
IEnumerator Start() {
Debug.Log("1.starting..." + Time.time);
yield return StartCoroutine(waitAndPrint(2.0f));
Debug.Log("1.Done...");
Debug.Log("2.starting...");
//開啟協程
StartCoroutine("doSomeThing", 2.0f)
yield return new WaitForSeconds(1);
//停止協程
StopCoroutine("doSomeThing");
//StopCoroutine(doSomeThing(2.0f))
}
IEnumerator waitAndPrint(float wait) {
yield return new WaitForSeconds(wait);
Debug.Log("wait and log" + Time.time);
}
IEnumerator doSomeThing(float wait) {
while(true) {
Debug.Log("do some thing" + Time.time);
yield return null;
}
}
}
協程通俗來說其實是使當前邏輯暫停執行,並且將控制權交給unity,但之後還可以從暫停的位置繼續執行餘下的邏輯。
協程可以使用來實現各種延遲效果,比如:
WaitForSeconds–暫停邏輯等待一段時間繼續執行
WaitForFixedUpdate–暫停直至下一次fixUpdate時才會繼續執行
WaitForEndOfFrame–等到幀結束再恢復執行邏輯,常用於截圖
2.協程和WWW
通過協程等待www載入完成,然後就可以通過www例項訪問下載的內容
下面通過一個綜合的例子來說明兩者配合使用:
public class HttpWrapper : MonoBehaviour {
public void GET(string url, Action<WWW> onsuccess, Action<WWW> onFail=null) {
WWW www = new WWW(url);
StopCoroutine(WaitForResponse(www, onsuccess, onFail));
}
private IEnumerator WaitForResponse(WWW www, Action<WWW> onsuccess, Action<WWW> onFail=null) {
yield return www;
if(www.error == null) {
onsuccess();
}else{
if(onFail)onFail(www);
}
}
}
public class httpTest : MonoBehaviour {
//無返回值的委託例項
private Action<WWW> onsuccess;
private void Start(){
this.onsuccess += this.successMethod;
HttpWrapper hw = GetComponent<HttpWrapper>;
hw.GET("http://asadad/a.png",this.onsuccess)
}
private successMethod(WWW www) {
if(www == null)
return;
Texture tex = www.texture;
renderer.material.mainTexture = tex;
}
}
協程有很廣泛的用途,網路上也有各種示例,本篇就到這裡了。。。睡覺!
相關文章
- unity學習筆記(一)Unity筆記
- unity學習筆記(三)Unity筆記
- Unity學習筆記--入門Unity筆記
- C#學習筆記C#筆記
- Unity Application Block 1.2 學習筆記UnityAPPBloC筆記
- golang學習筆記(二)—— 深入golang中的協程Golang筆記
- Unity熱更學習--Lua指令碼使用C#中的事件、委託和協程Unity指令碼C#事件
- c#學習筆記(一)C#筆記
- C#特性學習筆記C#筆記
- Unity 熱更--AssetBundle學習筆記 0.7Unity筆記
- Unity 熱更--AssetBundle學習筆記 0.8Unity筆記
- swoole 學習筆記-做一頓飯來理解協程筆記
- 學習筆記 - DNS協議筆記DNS協議
- IP協議學習筆記協議筆記
- Raft協議學習筆記Raft協議筆記
- Raft 協議學習筆記Raft協議筆記
- lua課程學習筆記筆記
- Unity3D學習筆記3——Unity Shader的初步使用Unity3D筆記
- 我的C#學習筆記14C#筆記
- 我的C#學習筆記1C#筆記
- PHP之Swoole 學習筆記-用做飯的方式來理解協程PHP筆記
- OAuth 2.0 協議學習筆記OAuth協議筆記
- Internet安全協議 學習筆記協議筆記
- 達內課程學習筆記筆記
- 機器學習課程筆記機器學習筆記
- Hellow C# unity學習記錄(8)函式的遞迴C#Unity函式遞迴
- 精通C#學習筆記--C# 與 .NET平臺C#筆記
- C# 多執行緒學習筆記 – 1C#執行緒筆記
- Unity學習筆記--資料持久化之PlayerPrefs的使用Unity筆記持久化
- CAN匯流排協議 學習筆記協議筆記
- 隨機過程學習筆記——概論隨機筆記
- 精通C#學習筆記---C#核心程式設計結構C#筆記程式設計
- 【學習篇】Swoole 協程
- [學習篇] Swoole 協程
- Unity3d 協程 StartCoroutineUnity3D
- C#學習筆記-欄位、屬性、索引器C#筆記索引
- Unity3D學習筆記6——GPU例項化(1)Unity3D筆記GPU
- Unity3D學習筆記4——建立Mesh高階介面Unity3D筆記