Menu
CoddyTech

初めてのコルーチン

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

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();と呼び出しても何も起きません。一時停止したメソッドが作られて破棄されるだけで、実行される行は一つもありません。また、yield return 3f;は3秒の待機ではありません。Unityが待機オブジェクトとして認識するのはWaitForSecondsなどで、それ以外の値は1フレームとして扱います。

challenge icon

チャレンジ

簡単

Spikes は床の下で待機しています。コルーチン Spring を使って、Spaceキーで罠を作動させましょう。

  • すぐに: Click をログに出力します。
  • 0.5秒後: スパイクが1単位上に跳ね上がります。
  • その2秒後: 1単位下に戻ります。

Play を押し、Spaceキーを押して動きを確認してから、Check を押します。

自分で試してみよう

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 下げる
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

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