これはC#yieldキーワードの動作です- www
オブジェクトに対して特別なことをするのではなく、含まれるメソッドに対して特別なことを意味します。具体的には、このキーワードはIEnumerable
(またはIEnumerator
)を返すメソッドでのみ使用でき、使用されますMoveNextが呼び出されたときに列挙子によって「返される」オブジェクトを示します。
コンパイラーはメソッド全体をステートマシンを使用して実装IEnumerable
(またはIEnumerator
)する別のクラスに変換するため、機能します。最終的な結果は、誰かが戻り値を列挙するまでメソッド自体は実行されないことです。これはどのタイプでも機能しますが、について特別なものは何もありませんが、特別なWWW
包含メソッドです。
見てみましょうC#のyieldキーワードの舞台裏を、いくつかのC#コンパイラが生成するコードの一種どのように多くの洞察力、または単に実験のためにとのようなもの使ってコードを自分で調べILスパイ
更新:明確にするため
- Unityが
yield return
ステートメントを含むコルーチンを呼び出すと、発生するのは列挙子が返されることだけです-この時点ではメソッド本体は実行されません
- メソッド本体を取得してUnityを実行するに
MoveNext
は、シーケンスの最初の値を取得するためにイテレーターを呼び出す必要があります。これにより、メソッドは最初のyeild return
ステートメントまで実行され、その時点で呼び出し元が再開します(おそらくUnityはフレームの残りの部分をレンダリングし続けます)
- 私が理解しているように、Unityは通常、
MoveNext
後続のフレームごとにイテレータのメソッドを呼び出し、メソッドyield return
の最後またはyield break
ステートメントのいずれかに達するまで、フレームごとに次のステートメントまでメソッドを再度実行しますシーケンスの終わり)
唯一の特殊ここビット(と中のカップルの他の例では)ダウンロードが完了したとき(メソッドが実行を継続させる)代わりに、それが唯一のイテレータを進め、Unityは次のフレームこの特定のイテレータを進めないということです。おそらくイテレータを進める必要があるときにUnityに信号を送るための一般的なメカニズムを含む基本YieldInstructionクラスがあるように見えますが、WWW
クラスはこのクラスから継承するようには見えないので、 Unityエンジンのこのクラス。
明確にするために、yield
キーワードはWWW
クラスに特別なことをせず、Unityが返された列挙のメンバーに与える特別な処理により、この動作を引き起こします。
2番目の更新:WWW
Webページを非同期でダウンロードするために使用するメカニズムについては、おそらく非同期IOを内部で使用するHttpWebRequest.BeginGetResponseメソッドを使用するか、スレッドを使用できます(専用スレッドを作成するか、スレッドプールを使用して)。
yield return
非同期操作に使用することはハッキングであることに注意してください。「実際の」C#プログラムではTask
、これを使用します。Unityは、.Net 4.0Task
が導入される前に作成されたため、おそらく使用していません。