はじめに
今回はコルーチンをコルーチン内・外から停止させる方法についての記事になります!
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 スクリプトリファレンス
さいごに
コルーチンは色々な使い方ができる優れものなので、是非上手く活用してあげてください。