ミドリ黄のプログラミングメモノート

主にUnity(C#)を中心としたプログラムの備忘録

Unity コルーチンの再開





導入

一度始めたコルーチンを中断したのち再開したいということが起こりました。
そこで次のようコルーチンで秒数を数えるスクリプトを作成しました。
(「A」でコルーチンを開始、「B」で中断)

using System.Collections;
using UnityEngine;

public class Sample1 : MonoBehaviour
{
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            StartCoroutine(Cor());
        }
        else if (Input.GetKeyDown(KeyCode.B))
        {
            StopAllCoroutines();
        }
    }

    IEnumerator Cor()
    {
        for (int i = 0; i < 10; i++)
        {
            yield return new WaitForSeconds(i);
            Debug.Log($"{i + 1}秒経過");
        }
    }
}



実行結果は次のようになり、再開後はi=4, 5, …としたいのですが、一度中断したらコルーチンは振り出しになってしまいました・・・。





解決策

結論から言うと型の変数にコルーチンを一度代入し、中断するときはこの変数をStopCoroutineすればよいです。
従って、スクリプトを修正すると次のようになります。

using System.Collections;
using UnityEngine;

public class Sample2 : MonoBehaviour
{
    IEnumerator a;

    private void Start()
    {
        a = Cor();
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            StartCoroutine(a);
        }
        else if (Input.GetKeyDown(KeyCode.B))
        {
            StopCoroutine(a);
        }
    }

    IEnumerator Cor()
    {
        for (int i = 0; i < 10; i++)
        {
            yield return new WaitForSeconds(i);
            Debug.Log($"{i + 1}秒経過");
        }
    }
}


実行結果は次のようになり中断からの再開ということが可能となりました。