初めてのコルーチン
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フレームとして扱います。
チャレンジ
簡単Spaceキーを押すと、コルーチンを使ってスパイクトラップを跳ね上げるようにしましょう。
IEnumerator Spring()を書きます。Clickをログに出力し、yield return new WaitForSeconds(0.5f);を実行してから、transform.position += Vector3.up;を実行します。- 同じ方法で2秒待ってから、
Vector3.upを再び差し引きます。 - 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プレイグラウンド