StartCoroutineの学習記録
StartCoroutineの使用:
IEnumerator Wait(float waitTimeValue){
//things before wait
yield return new WaitForSeconds(waitTimeValue);
//thigs after wait;
}
SatrtCoroutine(Wait(5.0f));
StartCoroutineに触れたばかりの頃は、IEnumeratorタイプ、yield returnという奇妙な文や
呼び出すときはStartCoroutine()でこのいくつかの問題を行い、ずっと顔を隠していました.何の鬼ですか.これは、
いくつかのブロガーの文章をゆっくり見た後、このいくつかの問題について初歩的な認識があり、ここに記録されています.
1.IEnumerator
IEnumeratorとyield returnは反復器を構築します.反復器はほとんどよく使われています.たとえば、次のようにします.
int[] array=new int[]{1,2,3};
foreach(int i in array){
print(i);
}
配列の遍歴過程は実際には反復器の応用過程であるが、この反復器はコンパイラによって実現され、コンパイラの内部では、上のコードはこのように似ている(本当に下より複雑である):
int[] array=new int[]{1,2,3};
IEnumerator e=array.GetEnumerator();
while(e.MoveNext()){
print(Current);
}
反復器内のメソッドMoveNext()と属性CurrentはIEnumeratorというインタフェースで定義されています.ここではIEnumeratorの完全な宣言です.
public interface IEnumerator //////要約://コレクション内の現在の要素を取得します.////結果://コレクション内の現在の要素を返します.//異常://T:System.InvalidOperationException://列挙数このコレクションの最初の要素の前または最後の要素の後. object Current { get; }////要約://列挙数を集合の次の要素に進めます.////結果を返す////列挙数が次の要素に成功するとtrue;列挙数がセットの最後を越えるとfalseになります.////異常://T:System.InvalidOperationException://列挙数を作成した後に集合が変更されました. bool MoveNext();////要約://列挙数を初期位置に設定します.この位置は、コレクションの最初の要素の前にあります.////異常://T:System.InvalidOperationException://列挙数を作成した後に集合が変更されました. void Reset(); }
2.yield returnは何をしているのか
yield returnはC#2.0以降に導入される現実的な反復器の簡単な構文であり、以前は完全な反復器を実現するにはIEnumerableとIEnumeratorの2つのインタフェースを実現する必要があったが、yield retrunを使用すると、IEnumerator Test(){yield return 1;yield retutn 2;yield retrun 3;}の2つのステップを省略することができる.コンパイラは類似のコードを生成します:public class InnerEnumerable:IEnumerable{public class InnerEnumerator:IEnumerator{int[]array=new int[]{1,2,3}int currentIndex=-1public bool MoveNext(){++currentIndex;return current}public Object Current{get{return array[currentIndex];}}public void Reset(){throw new Exception("error");} }public IEnumerator GetEnumerator(){return new InnerEnumerator();} } IEnumerator Test(){InnerEnumerable e= new InnerEnumerable();return e.GetEnumerator();
ここではIEnumerableをIEnumeratorのファクトリモードと見なすことができ,yield returnによりコンパイラにIEnumerableとIEnumeratorの2つのインタフェースを実現させる
3.なぜ呼び出したときにStartCoroutine()に呼び出されるのか
ここでは実現遅延プロセスと関係があり,WaitForSeconds,WaitForEndFrameなどのクラスでは遅延処理は行われていないが,彼らの親クラス,yieldInstructionでは
実際の遅延処理はStartCoroutineで行われ、StartCoroutine()が入力するパラメータはIEnumeratorであるため、遅延処理も行われていない.
StartCoroutineではIEnumeratorのMoveNext()が呼び出されますが、このIEnumeratorがWaitForSeconds、WaitFaorEndFrameなどのタイプであれば
StartCoroutineは特別扱いされ、遅延待ちを実行した後、MoveNext()を呼び出します.
http://blog.csdn.net/tkokof1/article/details/11842673このブロガーは自分のWaitForSecondsの機能を実現し、非常に詳細に書かれており、以上の内容もこの文に基づいて整理されています.
4.StartCoroutineのネスト実行順序
start1
test1
do something 1
start2
do something 2
test2
StartCoroutineにはyield return StartCoroutineがネストされています.最初のStartCoroutineは、2番目のStartCoroutineのすべてのコードが終了するまで実行を続行します.2番目のStartCoroutineのyield文は、最初のものに戻り、すぐに呼び出し先、つまり呼び出し先に戻ります.最初のStartCoroutineは、2番目の実行が完了してから実行を続行します.
IEnumerator Wait(float waitTimeValue){
//things before wait
yield return new WaitForSeconds(waitTimeValue);
//thigs after wait;
}
SatrtCoroutine(Wait(5.0f));
StartCoroutineに触れたばかりの頃は、IEnumeratorタイプ、yield returnという奇妙な文や
呼び出すときはStartCoroutine()でこのいくつかの問題を行い、ずっと顔を隠していました.何の鬼ですか.これは、
いくつかのブロガーの文章をゆっくり見た後、このいくつかの問題について初歩的な認識があり、ここに記録されています.
1.IEnumerator
IEnumeratorとyield returnは反復器を構築します.反復器はほとんどよく使われています.たとえば、次のようにします.
int[] array=new int[]{1,2,3};
foreach(int i in array){
print(i);
}
配列の遍歴過程は実際には反復器の応用過程であるが、この反復器はコンパイラによって実現され、コンパイラの内部では、上のコードはこのように似ている(本当に下より複雑である):
int[] array=new int[]{1,2,3};
IEnumerator e=array.GetEnumerator();
while(e.MoveNext()){
print(Current);
}
反復器内のメソッドMoveNext()と属性CurrentはIEnumeratorというインタフェースで定義されています.ここではIEnumeratorの完全な宣言です.
public interface IEnumerator //////要約://コレクション内の現在の要素を取得します.////結果://コレクション内の現在の要素を返します.//異常://T:System.InvalidOperationException://列挙数このコレクションの最初の要素の前または最後の要素の後. object Current { get; }////要約://列挙数を集合の次の要素に進めます.////結果を返す////列挙数が次の要素に成功するとtrue;列挙数がセットの最後を越えるとfalseになります.////異常://T:System.InvalidOperationException://列挙数を作成した後に集合が変更されました. bool MoveNext();////要約://列挙数を初期位置に設定します.この位置は、コレクションの最初の要素の前にあります.////異常://T:System.InvalidOperationException://列挙数を作成した後に集合が変更されました. void Reset(); }
2.yield returnは何をしているのか
yield returnはC#2.0以降に導入される現実的な反復器の簡単な構文であり、以前は完全な反復器を実現するにはIEnumerableとIEnumeratorの2つのインタフェースを実現する必要があったが、yield retrunを使用すると、IEnumerator Test(){yield return 1;yield retutn 2;yield retrun 3;}の2つのステップを省略することができる.コンパイラは類似のコードを生成します:public class InnerEnumerable:IEnumerable{public class InnerEnumerator:IEnumerator{int[]array=new int[]{1,2,3}int currentIndex=-1public bool MoveNext(){++currentIndex;return current}public Object Current{get{return array[currentIndex];}}public void Reset(){throw new Exception("error");} }public IEnumerator GetEnumerator(){return new InnerEnumerator();} } IEnumerator Test(){InnerEnumerable e= new InnerEnumerable();return e.GetEnumerator();
ここではIEnumerableをIEnumeratorのファクトリモードと見なすことができ,yield returnによりコンパイラにIEnumerableとIEnumeratorの2つのインタフェースを実現させる
3.なぜ呼び出したときにStartCoroutine()に呼び出されるのか
ここでは実現遅延プロセスと関係があり,WaitForSeconds,WaitForEndFrameなどのクラスでは遅延処理は行われていないが,彼らの親クラス,yieldInstructionでは
実際の遅延処理はStartCoroutineで行われ、StartCoroutine()が入力するパラメータはIEnumeratorであるため、遅延処理も行われていない.
StartCoroutineではIEnumeratorのMoveNext()が呼び出されますが、このIEnumeratorがWaitForSeconds、WaitFaorEndFrameなどのタイプであれば
StartCoroutineは特別扱いされ、遅延待ちを実行した後、MoveNext()を呼び出します.
http://blog.csdn.net/tkokof1/article/details/11842673このブロガーは自分のWaitForSecondsの機能を実現し、非常に詳細に書かれており、以上の内容もこの文に基づいて整理されています.
4.StartCoroutineのネスト実行順序
void Start () {
Debug.Log("start1");
StartCoroutine(Test());
Debug.Log("start2");
}
IEnumerator Test()
{
Debug.Log("test1");
yield return StartCoroutine(DoSomething());
Debug.Log("test2");
}
IEnumerator DoSomething()
{
Debug.Log("do something 1");
yield return null;
Debug.Log("do something 2");
}
出力結果:start1
test1
do something 1
start2
do something 2
test2
StartCoroutineにはyield return StartCoroutineがネストされています.最初のStartCoroutineは、2番目のStartCoroutineのすべてのコードが終了するまで実行を続行します.2番目のStartCoroutineのyield文は、最初のものに戻り、すぐに呼び出し先、つまり呼び出し先に戻ります.最初のStartCoroutineは、2番目の実行が完了してから実行を続行します.