はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】コルーチンをコルーチン内・外から停止させる方法

はじめに

今回はコルーチンをコルーチン内・外から停止させる方法についての記事になります!

StartCoroutineメソッドで実行したコルーチンを止めたいときはよくあるのではないでしょか。

例えばコルーチンをUpdateメソッドのように扱うためにwhile文でループをさせている際には、最終的にはなにかしらの方法でそのコルーチンを止める必要があるはずです。

その2つの方法について触れていきたいと思います。

コルーチン内からコルーチンを停止させる

コルーチン内からコルーチンを停止させるには以下のようなコードを書きます。

yield break;

これを実際に使ったサンプルを用意してみました。

using System.Collections;
using UnityEngine;

public class CoroutineTest : MonoBehaviour
{

    void Start()
    {
        StartCoroutine(SomeCoroutine());
    }

    private IEnumerator SomeCoroutine()
    {
        int i = 0;
        while (true)
        {
            if(i > 10) yield break;

            i++;
            Debug.Log(i);
            yield return new WaitForSeconds(.1f);
        }
    }
}

普通のメソッドでいうreturnとほぼ同じ要領で使うことができます。

覚えやすくていい感じですね。

コルーチン外からコルーチンを停止させる

実はStartCoroutineメソッドには返り値があります。

その返り値の型はUnityEngine.Coroutineというクラスで、StopCoroutineメソッドの引数にその変数を渡すとコルーチンを止めることができます。

using System.Collections;
using UnityEngine;

public class CoroutineTest : MonoBehaviour
{
    Coroutine _someCoroutine;

    private void Start()
    {
        _someCoroutine = StartCoroutine(SomeCoroutine());
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StopCoroutine(_someCoroutine);
        }
    }

    private IEnumerator SomeCoroutine()
    {
        int i = 0;
        while (true)
        {
            i++;
            Debug.Log(i);
            yield return new WaitForSeconds(.1f);
        }
    }
}

こちらはフィールド等でCoroutineクラスのインスタンスの参照を保持しておく必要があります。

先程のyield breakよりはやや覚えにくいかもしれません。

また、StopAllCoroutinesメソッドというものもあるので、一気に全部止めたい場合はこちらを使うのもありでしょう。

詳しくはこちらの公式の記事を参照してみてください。
MonoBehaviour-StopCoroutine - Unity スクリプトリファレンス

さいごに

コルーチンは色々な使い方ができる優れものなので、是非上手く活用してあげてください。