了解:協程不是線程,也不是異步執行(知道就行)。
1.協程和monobehaviour的update函數一樣,也是在mainthread中執行的(一定得明白這句話意思)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<code>void</code> <code>start () {</code>
<code> </code><code>startcoroutine(hellocoroutine());</code>
<code>}</code>
<code>void</code> <code>update () {</code>
<code> </code><code>debug.log(</code><code>"update..."</code><code>);</code>
<code>void</code> <code>lateupdate()</code>
<code>{</code>
<code> </code><code>debug.log(</code><code>"lateupdate..."</code><code>);</code>
<code>ienumerator hellocoroutine()</code>
<code> </code><code>while</code> <code>(</code><code>true</code><code>)</code>
<code> </code><code>{</code>
<code> </code><code>debug.log(</code><code>"coroutine..."</code><code>);</code>
<code> </code><code>yield</code> <code>return</code> <code>null</code><code>;</code>
<code> </code><code>}</code>
對比以上代碼和兩張截圖。這樣寫協程,好像是進階一點的update寫法。至少應該可以看出,這種寫法的協程可以完成update的功能。
2.與update不一樣的地方。
<code>ienumerator count()</code>
<code> </code><code>{</code>
<code> </code><code>int</code> <code>seconds = 0;</code>
<code> </code><code>while</code> <code>(</code><code>true</code><code>)</code>
<code> </code><code>{</code>
<code> </code><code>for</code> <code>(</code><code>float</code> <code>timer = 0; timer < 2; timer += time.deltatime)</code>
<code> </code><code>yield</code> <code>return</code> <code>0;</code>
<code> </code><code>seconds++;</code>
<code> </code><code>debug.log(seconds + </code><code>" seconds have passed since the coroutine started."</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>}<br></code>
3.yield
yiled return null 等同于 yield return 0
我這邊的了解是,停止正在執行的方法,并從下一幀開始執行(一般是0.02秒,與update的每一幀是一樣的,具體看unity設定的timer)。
4.協程是可以傳遞參數的。
5.協程還可以嵌套協程。
<code>ienumerator hellocoroutinue()</code>
<code> </code><code>debug.log(</code><code>"start----"</code><code>);</code>
<code> </code><code>yield</code> <code>return</code> <code>startcoroutine(wait(0.2f)); </code><code>// yield return new waitforseconds(0.2f);最終達到的效果是一樣的。</code>
<code> </code><code>debug.log(</code><code>"end----"</code><code>);</code>
<code> </code><code>ienumerator wait(</code><code>float</code> <code>s)</code>
<code> </code><code>for</code><code>(</code><code>float</code> <code>timer =0;timer< s;timer+=time.deltatime)</code>
<code> </code><code>{</code>
<code> </code><code>debug.log(</code><code>"目前 timer"</code> <code>+ timer.tostring());</code>
<code> </code><code>yield</code> <code>return</code> <code>0; </code><code>// yield return null;</code>
<code> </code><code>}</code>
<code> </code><code>debug.log(</code><code>"wait....."</code><code>);</code>
看截圖中畫線的時間差,再次驗證了與update好像。暫停的時間都是一樣的。
可以看到暫停了目前的方法去執行yield return後的方法。
補充注意:
a.多個協程可以同時運作,它們會根據各自的啟動順序來更新;
b.如果你想讓多個腳本通路一個協程,可以定義為靜态的協程;