LoginSignup
3
4

More than 5 years have passed since last update.

[Unity] 初心者から見たはじめてのコルーチン

Last updated at Posted at 2017-02-03

コルーチンとは何か?

詳細はネットのページを見て欲しい。(というのも自分がそんなに理解してないので説明できない)
「とりあえず処理を分割して、ちょっとずつ進めてくれる」という仕組みに見える

どういうときに使える?

関数内で大規模なfor文まわしたときに、フリーズに近い状態になり、進行状況が分からなくなる。
そのときにコルーチンを使うと、逐一updateされる。

書き方

とりあえず戻り値にIEnumeratorを設定して、中にyield return nullを書いて
呼び出すときにStartCoroutine(関数呼び出し);とやればいい模様。

//呼び出し側
StartCoroutine(KansuuMei());

//コルーチンを使う関数側
public IEnumerator KansuuMei(){

     //好きな場所に入れる
     yield return null;
}

実際の例

以下はボタンを押すとfor文を回す処理。
for文の途中でcurrent_processを設定しており、そこで進行状況を逐一updateする。
ところがコルーチンを使わないと、画面上ではフリーズに近い状態になり、処理が終わるまで進行状況は出てこない。(つまりボタンを押すと、フリーズして、最後に終わったと教えてくれる。それでは意味がない)

以下のようにコルーチンを使うと、進行状況が逐一報告されるようになる。

example.cs

public class CoroutineTest : MonoBehaviour {

public Text current_process_;

//ボタンをクリックしたとき
public void ButtonPushedByManual(){
        StartCoroutine(Compare(result_before, result_after));
}

public IEnumerator Compare(ReadCSV csv_before, ReadCSV csv_after)
{
        for (int i = 0; i < 100000; i++){

            for (int j = 0; j < 100000; j++){
                 public Text current_process_ = i.ToString() + "," j.ToString();
                 yield return null;
            }
        }
}

処理速度

for文に使ってみて気づいたが、入れる場所によって処理スピードがぜんぜん違う。

外側のfor文(浅い)に入れるほど早くなる(呼び出される回数が減るから?)
内側のfor文(深い)に入れるほど遅くなる(呼び出される回数が増えるから?)

「どのレベルまで更新情報が必要か」と
「どのレベルまで処理速度が必要か」の天秤なのかも。

匿名の知人からのアドバイス

「yield return すると、「そのフレームでの処理」はそこで終了するので、外側の for に入れると 1フレームでの処理が増える事になって、早く処理が終わる事になります。ただ、逆にフレームに費やす時間は増えるので、固まった様に見えるかもしれません。
天秤ですね。
固定で yield return するの微妙なので、1フレームで何秒まで処理させていいかという値を決めておいて、それを超えそうだったら yield return する、みたいな形にすると安定すると思います。」

その他の教訓

コルーチンは連呼しないほうがいい。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4