コルーチン

■概要

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を使用すれば
		一時停止扱いとなり、途中から処理が再開します。