天天看點

Unity3D 協程 淺談

了解:協程不是線程,也不是異步執行(知道就行)。

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>

Unity3D 協程 淺談
Unity3D 協程 淺談

對比以上代碼和兩張截圖。這樣寫協程,好像是進階一點的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 &lt; 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>}&lt;br&gt;</code>

  

Unity3D 協程 淺談

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&lt; 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>

 

Unity3D 協程 淺談

看截圖中畫線的時間差,再次驗證了與update好像。暫停的時間都是一樣的。

可以看到暫停了目前的方法去執行yield return後的方法。

補充注意: 

           a.多個協程可以同時運作,它們會根據各自的啟動順序來更新;

    b.如果你想讓多個腳本通路一個協程,可以定義為靜态的協程;

繼續閱讀