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;
}
}
協程有很廣泛的用途,網路上也有各種示例,本篇就到這裡了。。。睡覺!
相關文章
- gevent 學習筆記 —— 協程筆記
- unity學習筆記(一)Unity筆記
- unity學習筆記(三)Unity筆記
- Unity學習筆記--入門Unity筆記
- Lua學習筆記--迭代器和協程(二)筆記
- C#學習筆記C#筆記
- golang學習筆記(二)—— 深入golang中的協程Golang筆記
- Unity熱更學習--Lua指令碼使用C#中的事件、委託和協程Unity指令碼C#事件
- swoole 學習筆記-做一頓飯來理解協程筆記
- Unity Application Block 1.2 學習筆記UnityAPPBloC筆記
- C#特性學習筆記C#筆記
- C#字串學習筆記C#字串筆記
- C#學習筆記2C#筆記
- c#學習筆記(一)C#筆記
- Raft協議學習筆記Raft協議筆記
- Raft 協議學習筆記Raft協議筆記
- IP協議學習筆記協議筆記
- 學習筆記 - DNS協議筆記DNS協議
- lua課程學習筆記筆記
- Unity 熱更--AssetBundle學習筆記 0.7Unity筆記
- Unity 熱更--AssetBundle學習筆記 0.8Unity筆記
- 【C#學習筆記】Hello WorldC#筆記
- C#學習筆記(一) (轉)C#筆記
- OAuth 2.0 協議學習筆記OAuth協議筆記
- HTTP 協議 學習筆記一HTTP協議筆記
- PHP之Swoole 學習筆記-用做飯的方式來理解協程PHP筆記
- Unity3D學習筆記3——Unity Shader的初步使用Unity3D筆記
- 達內課程學習筆記筆記
- 我的C#學習筆記14C#筆記
- 我的C#學習筆記1C#筆記
- 【C#學習筆記】函式呼叫C#筆記函式
- 【C#學習筆記】陣列使用C#筆記陣列
- 【C#學習筆記】指標使用C#筆記指標
- 【C#學習筆記】改變字型C#筆記
- 【C#學習筆記】讀檔案C#筆記
- 【C#學習筆記】寫檔案C#筆記
- Internet安全協議 學習筆記協議筆記
- Hellow C# unity學習記錄(8)函式的遞迴C#Unity函式遞迴