unity學習筆記-C#協程

lawrenceZhang1210發表於2020-11-09

unity3D是單執行緒,因此需要協程機制來實現一些類似於多執行緒的功能,但要明確協程不是程式或執行緒,其執行過程類似於子例程,或者說不帶返回值的函式呼叫。

  1. 開啟協程
    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; 
	}
}

協程有很廣泛的用途,網路上也有各種示例,本篇就到這裡了。。。睡覺!

相關文章