Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

C#でcoroutineを使う

javascriptでcoroutineを使う際は、

処理1
yield WaitForSeconds(2);
処理2

と、yiledをはさむだけでよい。

C#の場合は、StartCoroutine/IENumearatorの組になるようだ。

public void endRecording(){
  if(isFile){
    titleScreen.endRecording();
    //
    StartCoroutine("resstartGame");
  }
}
	
IEnumerator resstartGame(){
  print ("before waiting");
  yield return new WaitForSeconds(3);	//Wait for 3 seconds
  print ("after waiting");
  Application.LoadLevel(0);	//If not writing, restart scene.
}

次の事例は、呼び出す関数に引数がある場合。

using UnityEngine;
using System.Collections;

public class DoCoroutine : MonoBehaviour {

	// Use this for initialization
	void Start () {
	    print("Starting " + Time.time);
            StartCoroutine("WaitAndPrint", 2.0F);
            print("Before WaitAndPrint Finishes " + Time.time);
	}
	
	// WaitAndPrint
	IEnumerator WaitAndPrint(float waitTime) {
            yield return new WaitForSeconds(waitTime);
            print("WaitAndPrint " + Time.time);
        }
}

この実行結果は次のようになる。

Starting 0
Before WaitAndPrint Finishes 0
WaitAndPrint 2.007803

つまり、呼び出す側ではStartCoroutineに続く行は即実行される。

StartCoroutineの引数は、関数オブジェクトでもよい。上例は次のように書いても良い。

       void Start () {
	    print("Starting " + Time.time);
            StartCoroutine(WaitAndPrint(2.0F));
            print("Before WaitAndPrint Finishes " + Time.time);
	}

※こういう参考事例も ねぎもちもち: Unityで音のフェードアウト

開始したCoroutineを停止する場合は、StopCoroutineを使う。

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    IEnumerator Start() {
        StartCoroutine("DoSomething", 2.0F);
        yield return new WaitForSeconds(1);
        StopCoroutine("DoSomething");
    }
    IEnumerator DoSomething(float someParameter) {
        while (true) {
            print("DoSomething Loop");
            yield return null;
        }
    }
}

StopCoroutineは、関数名の文字列でStartCoroutineを呼び出した場合のみ使える。なので、StartCoroutineは関数を文字列で呼び出すのを標準にしたほうが良さそう。