Unity協程認知

協程使用之前請注意以下幾點:

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)執行的過程中開啓的一段邏輯處理,和主線程共用一份資源,掛起的時候不會阻塞主線程,但要注意的是同一時刻只運行一個協程;多線程則不能共享主線程裏的資源,需要關心同步以及鎖的問題。

發佈了18 篇原創文章 · 獲贊 12 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章