Menu
CoddyTech

コルーチン内のループ

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エディターがフリーズします。

challenge icon

チャレンジ

簡単

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;
    }
}
quiz icon腕試し

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

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