コルーチン内のループ
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 24/63。
内部にyield returnがあるループは、各反復で次の反復の前に一時停止するため、多くのフレームにわたって実行されます。WaitForSecondsを使うと、ループは一定の間隔で処理を繰り返します。このサイレンは3回点滅します。
IEnumerator Flash()
{
for (int i = 0; i < 3; i++)
{
lamp.enabled = true;
yield return new WaitForSeconds(0.2f);
lamp.enabled = false;
yield return new WaitForSeconds(0.2f);
}
}yield return nullを使うと、条件が満たされるまでループは毎フレーム少しずつ処理を行います。これはコルーチンで何かをアニメーションさせる方法です。スケールが1のこの風船は、スケールが2になるまで1秒あたり0.5ずつ大きくなり、その後メッセージを出力します。
IEnumerator Inflate()
{
while (transform.localScale.x < 2f)
{
transform.localScale += Vector3.one * 0.5f * Time.deltaTime;
yield return null;
}
Debug.Log("Full");
}Time.deltaTimeはUpdate()と同じようにここで機能します。コルーチンはフレームごとに再開され、ループの後の行はループが完了したときにのみ実行されます。yieldがなければ、ループ全体が1フレームの中で実行され、風船は一瞬で膨らみきります。コルーチン内のwhile (true)ループは、毎回の反復でyieldする限り問題ありません。yieldしないとフレームを返さず、Unityエディターがフリーズします。
チャレンジ
簡単Spaceキーを押すと、城のPortcullisのコルーチンRideが開始します。門が次のように一往復するように、Rideを書きましょう。
speed(1.5)単位/秒の速さでheight(3)単位上昇し、頂上で正確に停止してOpenをログに出力します。- 1秒間、開いたままになります。
- 同じ速さで元の位置(
down)まで下がり、Closedをログに出力します。
Playを押してからSpaceキーを押し、次にCheckを押してください。
自分で試してみよう
using System.Collections;
using UnityEngine;
public class Portcullis : MonoBehaviour
{
public float speed = 1.5f;
public float height = 3f;
Vector3 down;
void Start()
{
down = transform.position;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine(Ride());
}
}
IEnumerator Ride()
{
// speed の速さで height 単位上昇して Open をログに記録し、1 秒間停止してから下降し、Closed をログに記録する
yield return null;
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。