協同程序這個好處大大的,用過的人都說好
轉載出處:http://wg2009perfect.blog.163.com/blog/static/127997663201211111222126/
一。什么是協同程序
協同程序,即在主程序運行時同時開啟另一段邏輯處理,來協同當前程序的執行。換句話說,開啟協同程序就是開啟一個線程。
二。協同程序的開啟與終止
在Unity3D中,使用MonoBehaviour.StartCoroutine方法即可開啟一個協同程序,也就是說該方法必須在MonoBehaviour或繼承於MonoBehaviour的類中調用。
在Unity3D中,使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以開啟一個線程。區別在於使用字符串作為參數可以開啟線程並在線程結束前終止線程,相反使用IEnumerator 作為參數只能等待線程的結束而不能隨時終止(除非使用StopAllCoroutines()方法);另外使用字符串作為參數時,開啟線程時最多只能傳遞 一個參數,並且性能消耗會更大一點,而使用IEnumerator 作為參數則沒有這個限制。
在Unity3D中,使用StopCoroutine(string methodName)來終止一個協同程序,使用StopAllCoroutines()來終止所有可以終止的協同程序,但這兩個方法都只能終止該 MonoBehaviour中的協同程序。
還有一種方法可以終止協同程序,即將協同程序所在gameobject的active屬性設置為false,當再次設置active為ture時,協同程 序並不會再開啟;如是將協同程序所在腳本的enabled設置為false則不會生效。這是因為協同程序被開啟后作為一個線程在運行,而 MonoBehaviour也是一個線程,他們成為互不干擾的模塊,除非代碼中用調用,他們共同作用於同一個對象,只有當對象不可見才能同時終止這兩個線 程。然而,為了管理我們額外開啟的線程,Unity3D將協同程序的調用放在了MonoBehaviour中,這樣我們在編程時就可以方便的調用指定腳本 中的協同程序,而不是無法去管理,特別是對於只根據方法名來判斷線程的方式在多人開發中很容易出錯,這樣的設計保證了對象、腳本的條理化管理,並防止了重 名。
/// <summary> ///生成圖片 /// </summary> public void CreateSprite() { StopCoroutine(DestroySprite(buttongame)); if(buttontype == ButtonType.Expand) { int pos = Random.Range(0,materials.Length); Vector3 position = new Vector3(Random.Range(-5,5f),Random.Range(0.5f,0.8f),Random.Range(-3,3)); Quaternion rotation = Quaternion.AngleAxis(90,Vector3.right); GameObject go = ObjectPool.Instance.MyInstantiate(Photo,position,rotation); go.transform.parent = Container.transform; go.transform.localScale = new Vector3(0.5f,1,0.5f); go.renderer.material = materials[pos]; Container.GetComponent<Container3D>().Start(); StartCoroutine(DestroySprite(buttongame)); } } IEnumerator DestroySprite(GameObject go) { yield return new WaitForSeconds(5f); Destroy(go); }
自己寫的腳本比較渣。CreateSprite();這個函數是UGUI Button的點擊事件, 當點擊的時候先把DestroySprite攜程終止掉,然后實例化圖片以后再繼續開啟攜程,5秒后銷毀這個Button。如果在5秒內再次觸發按下這個Button后,程序會從新計算時間然后執行
另外Invoke這個也可以實現計時,不過Invoke他不能有參數。所以還是用協同吧。