Unityのコルーチンとは?使い方をまとめました

19/02/03 15:28:59     19/02/17 20:02:06

Unityのコルーチン?

Unityのコルーチンとは、処理を中断や再開する仕組みのことです。あらかじめ処理の中断、再開のタイミングを決められるのですが、これはゲームのシーンを思い返すとイメージしやすいかと思います。

このページでは、主にコルーチンの使い方のソースコードを紹介し、補足説明していきます。

コルーチンの基本的な書き方

コルーチンの文法は、IEnumerator型を戻り値とした関数を定義することで、その関数をコルーチンとして扱います。まずコルーチンを実行するためのコードは以下です。

StartCoroutine("コルーチン名")

もしくは、

StartCoroutine(IEnumerator型の変数)

というコードになります。逆にコルーチンを途中で止めるためのコードは以下です。

StopCoroutine("コルーチン名")

もしくは、

StopCoroutine(Enumerator型の変数)

となります。

コルーチン実行のサンプルコードは以下です。

public class Test : MonoBehaviour {
    void Start () {
        // コルーチンを実行
        StartCoroutine ("Sample");
    }

    // コルーチン
    private IEnumerator Sample() {
        // コルーチンの処理
    }
}

次に、コルーチン途中中断のサンプルコードは以下です。

private IEnumerator Sample() {
    // ログ出力
    Debug.Log ("1");

    // 1秒待つ
    yield return new WaitForSeconds (1.0f);

    // ログ出力
    Debug.Log ("2");

    // 2秒待つ
    yield return new WaitForSeconds (2.0f);

    // ログ出力
    Debug.Log ("3");
}

yield return new WaitForSeconds (秒数);というコードは、一時中断後リスタートするまでの秒数を表します。

コルーチンを途中ブレークさせるコード

コルーチンを途中で強制終了することができます。とはいえ普通にループをブレークするのと同じロジックなので難しくはありません。

private IEnumerator Sample() {
    for (int i = 0; i < 10; i++) {
        Debug.Log ("i:" + i);
        yield return new WaitForSeconds (1f);

        // i==4になったらコルーチン終了
        if (i == 4) {
            yield break;
        }
    }
}

コルーチンで引数を渡す

コルーチンは第一引数にクラスを指定しますが、第二引数にそのクラスに渡す引数を設定することが可能です。サンプルコードは以下です。

void Start () {
    // コルーチンに引数に5を渡して実行
    StartCoroutine ("Sample", 5);
}

private IEnumerator Sample(int num) {
    for (int i = 0; i < num; i++) {
        Debug.Log ("i:" + i);
        yield return new WaitForSeconds (1f);
    }
}

この例では、引数である5を渡し、クラスのなかでは引数をループのカウント回数として使用しています。コルーチンの呼び出しで引数を設定する場合上記のように第二引数に渡す値を一つしか設定できませんが、別の方法で二つ以上の引数を渡すことも可能です。

コルーチンで二つ以上の引数を渡す方法

普通にコルーチンに引数を設定すると第二引数の値しか渡すことができませんが、第一引数であるクラス名に対して引数を設定すれば、二つ以上の引数を渡すことが可能です。サンプルコードを見るとイメージしやすいでしょう。

void Start () {
    StartCoroutine (Sample(5, 0.5f));
}

private IEnumerator Sample(int num, float interval) {
    for (int i = 0; i < num; i++) {
        Debug.Log ("i:" + i);
        yield return new WaitForSeconds (interval);
    }
}

StartCoroutineの第一引数のSampleに対し、さらに引数を設定しています。StartCoroutine自体の引数は一つとし、引数として設定したクラスに対して複数の引数を設定すれば、それをそのままクラスに渡すことができます。

コルーチンのなかでさらにコルーチンを実行する

コルーチンのなかでさらにコルーチンを実行することもできます。インデントを深くし過ぎるとややこしいのですが、無限になかに入れていくことも可能です。サンプルコードは以下です。

void Start () {
    StartCoroutine ("Sample1");
}

private IEnumerator Sample1() {
    for (int i = 0; i < 5; i++) {
        Debug.Log ("Sample1 i:" + i);

        // 別のコルーチンを実行して終わるまで待つ
        yield return StartCoroutine ("Sample2");
    }
}

private IEnumerator Sample2() {
    for (int i = 0; i < 3; i++) {
        Debug.Log ("Sample2 i:" + i);
        yield return new WaitForSeconds (1f);
    }
}

上記のコードでは、Sapmple2のなかにさらにコルーチンを作って別クラスを呼び出すことも可能です。

別クラスのコルーチンを実行する

クラスオブジェクトを作り、そのクラスのコルーチンを指定して実行することも可能です。サンプルコードは以下です。

public class Test {
    public IEnumerator Sample() {
        for (int i = 0; i < 3; i++) {
            Debug.Log ("Test Sample:" + i);
            yield return new WaitForSeconds (1f);
        }
    }
}
void Start () {
    StartCoroutine ("Sample");
}

private IEnumerator Sample() {
    // Test.Sample()を実行して、それが終わるまで待つ
    Test test = new Test ();
    yield return StartCoroutine (test.Sample());

    Debug.Log ("End");
}

別クラスのコルーチンを停止する

実行同様、別クラスのコルーチンを停止することもできます。サンプルコードは以下です。

void Start () {
    StartCoroutine ("Sample");
}

void Update () {
    // 「1」が押されたら「Sample」コルーチンを終了
    if (Input.GetKey (KeyCode.Alpha1)) {
        StopCoroutine ("Sample");
    }
}

private IEnumerator Sample() {
    for (int i = 0; i < 100; i++) {
        Debug.Log ("i:" + i);
        yield return new WaitForSeconds (1f);
    }
}

コルーチンについて解説してきましたが、仕組みとしてはそれほど難しくないかと思います。実行と停止があって、それぞれ別クラスからの実行や引数を複数使った方法などがあります。

【Unity関連記事】
▼Unityの基礎編
・ 【unityのフリーランス求人・案件情報】エンジニア需要や開発単価、未経験でもいける?
・ 【unity入門】ゲーム開発だけじゃない、Unityで出来ること

▼Unityの外部アセット、リソース編
・ UnityでMMDモデルを自由自在に動かしてみよう!
・ Unity adsを使って簡単に広告を導入しよう
・ Unityのアセットストアの上手な使い方
・ Unityで作られているARアプリをまとめてみました

▼Unityのコンポーネント編
・ Unityのrigidbodyを使って物理演算を導入してみよう
コードを使わずにUnityでキャラ追従のカメラを作る方法
・ Unityで簡単にアニメーションを作成する方法をまとめました
・ Unityでオブジェクトを回転させる方法をわかりやすくまとめました
・ Unityのtransformを使ってオブジェクトの座標や回転を操作する
・ Unityのアニメーターを簡単に作成する方法まとめ
・ UnityのShaderの解説と使い方まとめました
・ Unityで「当たり判定」(衝突判定)を付ける方法
・ Unityのgetcomponentの上手な使い方と使用時の注意点まとめ
・ Unityでキャラの移動を制御する方法まとめ
Unityのraycastを使って出来ることをまとめました

▼Unityのデフォルト機能、ゲーム製作編
blenderで作ったオブジェクトをUnityで組み込んでみよう
・ (この記事)Unityのコルーチンとは?使い方をまとめました
Unityで作られているRPGゲームを作るための6つのステップ
・ Unityのパーティクルを使って演出できるエフェクト例
・ UnityでのUIデザインの基礎をまとめてみました
Unityのcloud buildの便利な点をまとめました
・ Unityを使って半日でFPSゲームを作ってみよう

人気記事

編集部おすすめ記事

この記事を読んだ人はこんな記事を読んでいます

案件探しやフリーランスになるための相談する