もくじ
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より。
下記のように書くと、スタート時以降、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 直後"); }