初めてのコルーチン
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フレームとして扱います。
チャレンジ
簡単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 下げる
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。