日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity 协程Coroutine综合测试

發布時間:2025/3/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity 协程Coroutine综合测试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Unity 協程Coroutine綜合測試

1 using UnityEngine; 2 using System.Collections; 3 using System.Text; 4 5 public class rotCube : MonoBehaviour { 6 7 //示例,如何為一個自定義對象實現GetEnumerator接口,從而可以對該對象使用foreach 8 //這種寫法是c#2.0才有的,通過yield關鍵字與IEnumerator返回類型組合成一個枚舉器 9 //C#會自動生成一個IEnumerator類,該類實現了MoveNext(),Reset(),Current 10 //在C#2.0之前,我們必須自己來寫一個IEnumerator類,才實現上面的接口與屬性 11 class MyCalc : IEnumerable{ 12 int rest = 1; 13 public int x = 1; 14 public int y = 1; 15 16 public IEnumerator GetEnumerator () 17 { 18 for(int i=0; i<y; ++i) 19 { 20 yield return rest = x * rest; 21 } 22 } 23 } 24 25 //示例,如何將一個函數寫成可以被枚舉的對象(擁有MoveNext(),Reset(),Current) 26 //C#會自動生成一個IEnumerator類,該類實現了MoveNext(),Reset(),Current 27 //在C#2.0之前,我們必須自己來寫一個IEnumerator類,才實現上面的接口與屬性 28 IEnumerable calc(int x, int y){ 29 int rest = 1; 30 for(int i=0; i<y; ++i) 31 { 32 yield return rest = x * rest; 33 } 34 } 35 36 IEnumerator waitprint(){//協程返回類型必須為IEnumerator,它不認IEnumerable,如yield return DoCheck (),若DoCheck為IEnumerable,則DoCheck不會被執行 37 38 //StartCoroutine("DoCheck");//啟動一個新的協程 39 //yield return DoCheck (); //在這里進入死循環,若改為StartCoroutine("DoCheck");則不會進入死循環,只會另外啟動一個協程 40 41 yield return new WaitForSeconds (5); //暫停5秒,若流程走到了這里,協程將在這里阻塞5秒才執行下面的代碼 42 yield return new GameObject (); 43 yield return 2; 44 } 45 IEnumerable waitPrint(){ 46 yield return 1; 47 yield return 2; 48 } 49 50 IEnumerator DoCheck(){ 51 for(;;){ 52 Debug.Log ("doecheck"); 53 //協程調用頻率最高是每幀一次,這里我們指定的等待時間小于一幀,并不能達到一幀調用多次docheck的效果 54 yield return new WaitForSeconds (0.0001f); //0.1毫秒,1/0.0001F = 10000 fps,顯然U3D不可能達到這個幀率 55 } 56 } 57 58 void Start () { 59 60 /************************************************************************/ 61 /* 自定義對象的枚舉測試,自定義方法的枚舉測試,這是理解協程的基礎 */ 62 /************************************************************************/ 63 StringBuilder sbd = new StringBuilder(50); 64 foreach(var n in calc (2, 8)){ 65 sbd.Append (n); 66 sbd.Append (","); 67 } 68 69 sbd.Length = 0; 70 MyCalc omc = new MyCalc (){ x = 2, y = 8 }; 71 foreach(var n in omc){ 72 sbd.Append (n); 73 sbd.Append ((",")); 74 } 75 76 77 /************************************************************************/ 78 /* 協程綜合測試 */ 79 /************************************************************************/ 80 //U3D協程特征:本質是一個返回值為IEnumerator的函數,函數中至少有一條yield return語句。 81 //協程必須由StartCoroutine來啟動 82 //協程并非線程,線程是操作系統層的東西,協程是引擎層面由邏輯調用來實現的,是由一個線程操作出來的,在LUA中是由LUA狀態機實現,在U3D是由U3D引擎狀態機實現。 83 //在U3D中,協程是U3D引擎在每幀的update之后調用一次協程函數來實現,在update()中寫一個死循環,會發現程序卡死,協程也不會執行了。這證明了協程和主線程是同一線程。 84 //UNITY手冊的Execution Order of Event Functions一節詳細講解了協程的調用時機,從中可以看出協程只是主線程中的邏輯調用,并非一個新線程。 85 86 //StartCoroutine ("DoCheck"); 87 //yield return waitprint (); //waitprint被完整執行 88 //yield return waitPrint (); //waitPrint沒有被執行,U3D不認這種形式 89 90 91 //協程返回類型必須為IEnumerable。 92 //但不管一個函數的返回類型是IEnumerable還是IEnumerator,只要函數體中有一句yield return,編譯器就會自動為該函數生成一個IEnumerator類型的對象。 93 //就可以使用此迭代器對象的MoveNext(), Current等方法,屬性。若是返回類型為IEnumerable,編譯器還會生成GetEnumerator()方法。 94 waitprint ();//直接調用協程函數無效,不會進入該函數執行,這時僅相當于返回了一個IEnumerator迭代子的臨時對象,并沒有執行具體代碼。 95 96 //只有如下調用,才會完整的執行協程函數 97 IEnumerator i = waitprint (); 98 i.MoveNext (); //從函數入口執行到yield return new WaitForSeconds (5); 99 i.MoveNext (); //從上一個yield語句末執行到yield return new GameObject (); 100 i.MoveNext (); //從上一個yield語句末yield return 2; 101 //下面這種寫法并不能達到上面的效果,原因是每次waitprint ()返回的是一個不同的臨時對象,通過gethashcode可以發現。 102 //waitprint ().MoveNext (); 103 //waitprint ().MoveNext (); 104 //waitprint ().MoveNext (); 105 106 //返回值為IEnumerable類型的示例 107 //只有返回值為IEnumerable的方法才能用于foreach,因為它要求實現GetEnumerator 108 i = waitPrint ().GetEnumerator (); 109 i.MoveNext (); 110 i.MoveNext (); 111 i.MoveNext (); 112 113 print ("done"); 114 } 115 116 void Update(){ 117 transform.Rotate (0, 2, 0); 118 } 119 }

?

posted on 2016-10-21 20:09 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏

總結

以上是生活随笔為你收集整理的Unity 协程Coroutine综合测试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。