Menu
CoddyTech

初めてのコルーチン

CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 24/71。

Update()は毎フレーム終了しなければならないため、待つことはできません。コルーチンなら待つことができます。コルーチンは一時停止し、停止したところから後で再開するメソッドです。IEnumeratorを返すため、using System.Collections;が必要です。また、その中の各yield returnが一時停止になります。C#では、yield returnを使うと、値を一度に1つずつ渡すメソッドになります。待ち時間が終わると、Unityが次の値を要求します。yield return nullは1フレーム待ち、yield return new WaitForSeconds(3f)は3秒待ちます。

StartCoroutine(Cycle())でコルーチンを開始します。この信号機は緑になり、3秒後に黄色になり、さらに1秒後に赤になります:

using System.Collections;
using UnityEngine;

public class TrafficLight : MonoBehaviour
{
    Renderer lamp;

    void Start()
    {
        lamp = GetComponent<Renderer>();
        StartCoroutine(Cycle());
    }

    IEnumerator Cycle()
    {
        lamp.material.color = Color.green;
        yield return new WaitForSeconds(3f);
        lamp.material.color = Color.yellow;
        yield return new WaitForSeconds(1f);
        lamp.material.color = Color.red;
    }
}

StartCoroutineはコルーチンを最初のyieldまで直ちに実行し、その後Start()は処理を続けます。Unityは各待ち時間の後、ローカル変数をそのまま保持して再開します。StartCoroutineを使わずに単にCycle();と呼んでも何も起きません。一時停止状態のメソッドが作られて破棄されるだけで、その中のコードは1行も実行されません。また、yield return 3f;は3秒の待ち時間ではありません。Unityが認識するのはWaitForSecondsなどの待機オブジェクトだけで、それ以外の値は1フレームとして扱います。

challenge icon

チャレンジ

簡単

Spaceキーを押すと、コルーチンを使ってスパイクトラップを跳ね上げるようにしましょう。

  1. IEnumerator Spring()を書きます。Clickをログに出力し、yield return new WaitForSeconds(0.5f);を実行してから、transform.position += Vector3.up;を実行します。
  2. 同じ方法で2秒待ってから、Vector3.upを再び差し引きます。
  3. Spaceキーのif内で、StartCoroutine(Spring());を使ってコルーチンを開始します。

「プレイ」を押してSpaceキーを押します。スパイクが跳ね上がり、その後沈みます。それから「確認」を押します。

自分で試してみよう

using System.Collections;
using UnityEngine;

public class SpikeTrap : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // コルーチンでトラップを作動させる
        }
    }

    // IEnumerator Spring(): クリックし、0.5 s待ち、1 unit上昇し、2 s待ち、1 unit下降する
}

物理演算とゲームプレイのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド