コルーチン

概要

Unityにはコルーチンと呼ばれる仕組みが実装されています。
このコルーチンは1つの関数を途中で終了させ、
次のフレーム、または一定時間後に終了箇所から開始できます。
敵の作成やフェードなど一定間隔で行いたい処理に対して効果を発揮します。
	
例:
	コルーチン関数()
	{
		処理1
		一定時間待機
		処理2
		一定時間待機
		処理3
	}

上記の例のコードの流れはまずコルーチン関数が実行され、
関数の先頭から処理が始まります。
処理1を実行した後に一定期間待機の命令を実行することで、
コルーチン関数の処理が一時停止し、一定時間経過後は処理2から始まり、
処理終了後は再度一定時間待機し、その後処理3を実行します。

コルーチンの例

①.Hierarchyで「Cube」を作成する ②.C#スクリプトを作成し、名前を「Cube」とする ③.以下の内容をスクリプトのクラス内に記述する // Use this for initialization void Start () { // コルーチン開始 StartCoroutine ("ChangeScale"); } // Update is called once per frame void Update () { } // スケール変更 IEnumerator ChangeScale() { Vector3 scale = gameObject.transform.localScale; while (scale.x <= 5.0f) { scale.x += 0.1f; scale.y += 0.1f; scale.z += 0.1f; gameObject.transform.localScale = scale; // 毎フレーム呼び出し yield return null; } } ④.①で作成したCubeに②で作成したスクリプトを関連付ける ⑤.実行

コルーチン関数

コルーチン関数は「IEnumerator(アイ・エニュメレイター)」を戻り値の型とした関数です。

書式

書式例

IEnumerator 関数名(引数)

具体例

IEnumerator ChangeScale() 戻り値の型さえIEnumeratorであれば引数の数はいくつでも使用することができたりと 自由度の高い関数が作成可能です。

処理停止のさせ方

yield(イールド)

コルーチン関数で処理の一時停止を行うには「yield(イールド)」と呼ばれる キーワードをreturn文で使用します。 例: IEnumerator ChangeScale() { yield return null; }

WaitForSecondsクラス

returnで返す値の内容で待機時間が変わります。 nullだった場合の待機時間は1フレームです。 1フレーム以上待機させたい場合は「WaitForSecondsクラス」を使用します。 例: IEnumerator ChangeScale() { // 1秒待機 yield return new WaitForSeconds(1.0f); }

コルーチン関数の注意点

コルーチン関数は最低1つは「yield return」を設定する必要があります。 1つも設定がない場合エラーになるので注意して下さい。 例: IEnumerator ChangeScale() { // yield return がないからエラー }

コルーチン開始

コルーチンを開始するには「StartCoroutine」関数を使用します。

関数仕様

・関数名 StartCoroutine ・戻り値 成功:作成されたCoroutineクラス 失敗:エラー(処理停止) ・引数その1 string: コルーチン関数名 例: StartCoroutine("ChangeScale"); ・引数その2 string: コルーチン関数名 object: コルーチン関数の引数 例: StartCoroutine("ChangeScale", 1.0f); ・引数その3 IEnumerator: IEnumerator(コルーチン関数の戻り値を使用) 例1: IEnumerator func = ChangeScale(1.0f, 5.0f); StartCoroutine(func); 例2: StartCoroutine(ChangeScale(1.0f, 5.0f)); ※コルーチン関数はStartCoroutineで起動するまでは実行されないので、  「IEnumerator func = ChangeScale(1.0f, 5.0f)」では処理は動作せず、  戻り値のIEnumeratorは返ってきます。 ・内容 引数で指定したコルーチンを起動します。 指定したコルーチンがなかった場合はnullなどの情報が返るのではなく 動作停止になるので注意が必要です。

コルーチンの終了

コルーチン終了は処理が関数の最後まで進むと終了するか
外部から「StopCoroutine関数」を呼ぶことで終了します。

関数仕様

・関数名 StopCoroutine関数 ・戻り値 なし ・引数その1 string: コルーチン関数名 例: StopCoroutine("ChangeScale"); ・引数その2 Coroutine: 停止させたいコルーチンクラスオブジェクト 例: Coroutine coroutine = StartCoroutine("ChangeScale"); StopCoroutine(coroutine); ・引数その3 IEnumerator: 停止させたいコルーチン関数のIEnumerator 例: IEnumerator func = ChangeScale(); StartCoroutine(func); StopCoroutine(func); ・内容 コルーチンに関する情報を指定し、そのコルーチンを停止させる IEnumeratorの場合は停止後にStartCoroutineを使用し、 停止用に指定した際と同じIEnumeratorを使用すれば 一時停止扱いとなり、途中から処理が再開します。