協程使用之前請注意以下幾點:
1.協程只需要調用一次,只需要調用一次,只需要調用一次 !
2.yield return表示掛起,掛起的意思是協程裏的變量會被保留,直到達到return的條件纔會執行return以下的代碼片段。
舉個例子:
yield return new WaitForSeconds(0.9f);//執行到這兒,等待0.9s,繼續執行這句代碼以下的代碼片段
3.開啓協程的方式:
a.StartCorountine("協程函數名");
b.StartCorountine(協程函數名(協程形參));//可以傳多個參數
4.協程只需調用一次,但可以控制內部執行次數:
a.一次:不需要判斷語句
舉個例子:
IEnumerator OnlyOnce()//i++和++i的差別請自行百度
{
int i = 0;
yield return i++;//i加1以後執行Debug語句
Debug.Log("i = {0}" + i);
}
void Start()
{
StartCorountine("OnlyOnce");//控制檯輸出:i = 1
}
b.有限次:需要判斷語句
舉個例子:
IEnumerator FiniteTimes()
{
int i = 0;
while(i < 9)
{
i++;
//只需要執行協程,無條件掛起,可以用yield return null 或者 yield return 0
yield return i;
}
Debug.Log("i = " + i);
}
void Start()
{
StartCorountine(FiniteTimes());//輸出: i = 9
}
c.無限次,類似Update或者FixedUpdate函數:永真式->while(true)
舉個例子:
IEnumerator AllTheWay()
{
int i = 0;
while(true)
{
yield return ++i;
if(i > 9)
{
yield break;//yield break爲結束循環的語句,表示協程內的循環執行到這兒結束,類似一般循環中的break
}
Debug.Log("i = " + i);//會輸出1-9
//可以多個yield return語句同時使用
yield return new WaitForSeconds(0.9f);//等待0.9秒,執行下面代碼塊
yield return new WaitForEndOfFrame();//等待所有GameObject渲染完成之後執行後面語句
}
}
5. 一個最近弄明白的坑
目標:點擊UGUI的button,立即輸出“CallFunc()”
//將CallFunc掛到UGUI的button上,點擊button,然後..........
//然後等2.9s後纔會輸出“CallFunc()”
public void CallFunc()
{
Debug.Log("CallFunc()");
StartCoroutine(Func());
}
IEnumerator Func()
{
yield return new WaitForSeconds(2.9f);
Debug.Log("Func()");
}
解決方法: 協程前面加一行代碼(a)yield return 0;(b)yield return null;
IEnumerator Func()
{
//yield return null;
yield return 0;
yield return new WaitForSeconds(2.9f);
Debug.Log("Func()");
}
6.協程不是多線程:
協程是在主線程(Main Thread)執行的過程中開啓的一段邏輯處理,和主線程共用一份資源,掛起的時候不會阻塞主線程,但要注意的是同一時刻只運行一個協程;多線程則不能共享主線程裏的資源,需要關心同步以及鎖的問題。