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