StartCoroutine()+IEnumerableを返すメソッド+WaitForSecondsで秒数を測る

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

Unityで時間を測りたい。

前提

Unity 2021.3.31f1

コルーチンを使った待ち処理の作り方

まず、戻り値がIEnumeratorのメソッドを作る。

    IEnumerator MyWait()
    {

    }

その中に、yield return WaitForSeconds(待ちたい秒数) を書く。
ここの時点で、待ちが行われる。

    IEnumerator MyWait()
    {
        yield return WaitForSeconds(5.0f); // 5秒待つ
    }

yield returnの後ろに、待った後にやりたい処理を書く。

    IEnumerator MyWait()
    {
        yield return WaitForSeconds(5.0f);
        Debug.Log("5秒待ちました"); 
    }

そのメソッドを、StartCoroutine()の引数として呼ぶ。

    void Start()
    {
        // コルーチンを呼び出す
        StartCoroutine(MyWait());
    }

    IEnumerator MyWait()
    {
        yield return WaitForSeconds(5.0f);
        Debug.Log("5秒待ちました"); 
    }

上記のようにすると、「スタート直後に5秒待ったあと、"5秒待ちました"」というログが出る処理になる。

サンプル

Unity Learnのレッスン5.1より。

https://learn.unity.com/tutorial/lesson-5-1-clicky-mouse-jp?uv=2021.3&projectId=5f7c0c35edbc2a0020a38456&missionId=5f7648a4edbc2a5578eb67df&pathwayId=5f7e17e1edbc2a5ec21a20af#5f9a4b42edbc2a0020d39c83

下記のように書くと、スタート時以降、1秒待ってスポーンする、という処理を永久ループで続けるようになる。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public List<GameObject> targets;
    private float spawnRate = 1.0f;

    void Start()
    {
        // コルーチンを呼び出す
        StartCoroutine(spawnTarget());
    }

    IEnumerator spawnTarget()
    {
        while (true)
        {
            yield return new WaitForSeconds(spawnRate);

            // ターゲットをSpawnする処理
            int index = Random.Range(0, targets.Count);
            Instantiate(targets[index]);
        }
    }
}

備考

StartCoroutine()ではブロックがかかったりはしない。
spawnTarget()の中で待ちに入るが、StartCoroutine()はそれを待たずに(1秒待ったりせずに)すぐ抜けていく。 のログが出る。

    void Start()
    {
        // コルーチンを呼び出す
        StartCoroutine(spawnTarget());

        Debug.Log("StartCoroutine 直後");
    }