はきだめ

主にプログラミングに関することをかきます

【Unity】コルーチンまわりのメモ

コルーチンの定義

  • 返り値がIEnumerator
  • yeild rutnrn ◯を含む

コルーチンのいいところ

◯秒待ったら処理をする、××の処理が終わったら〇〇の処理をやるといったプログラムを直感的に書ける

サンプル

IEnumerator enumerator;
void Start () {
    enumerator = Hoge();    
    StartCoroutine(enumerator);
}
IEnumerator Hoge(){
    Debug.Log("hoge");
    yield return null;
}

中断、待機、終了など

yield return null; // 1フレーム処理を中断する
yield return new WaitForSeconds( num ); //num秒待機する
yield break; //関数を終了させる

StartCoroutineの罠

  • コルーチンを回しているオブジェクトが非アクティブになったとき停止する
  • MonoBehaviourを継承していないと使えない
  • UpdateでStartCoroutineを呼ぶと毎フレームごとに増える

StartCoroutineを使わない場合

下記のコードはStartCoroutineを使って書いた上記のコードと同義

IEnumerator enumerator;
void Start () {
    enumerator = Hoge();    
}   
void Update () {
    enumerator.MoveNext(); //yield return nullが書いてあるところまで処理を進める
}
IEnumerator Hoge(){
    Debug.Log("hoge");
    yield return null;
}

ただしMonoBehaviourを継承していない場合はyield return new WaitForSeconds( num );といった便利な関数が使えないため少々泥臭い方法が必要になる。

WaitForSecondsを使わない場合

//3秒処理を止める
for(float timer = 0; timer < 3.0f; timer += Time.deltaTime)
{
    yield return null;
}

補足

C#のforeachはMoveNext()やIEnumeratorで実装されている。

ykimisaki.hatenablog.jp

参考

コルーチンの使い方

cfm-art.sakura.ne.jp

qiita.com