[Unity] スクリプトの有効/無効状態にコルーチンを連動させる
GameObjectにアタッチしたスクリプトのenabledフィールドをfalseにした場合(スクリプトを無効にした場合)、Update()などが呼び出されなくなり更新処理が止まります。
しかし、前述のスクリプトから呼び出されたコルーチンは止まりません。
たとえば、以下のようなカウンタ値を1秒ごとに出力するスクリプトでは、スクリプトを無効にしてもコルーチンが動き続け値が表示され続けます。
using UnityEngine; using System.Collections; public class TimeCounter : MonoBehaviour { // 1秒ごとにカウンタをインクリメントして表示するコルーチン IEnumerator Start() { int count = 0; while ( true ) { // カウンタ値表示 Debug.Log(count++); // 1秒待機 yield return new WaitForSeconds(1); } } }
コルーチンをスクリプトの有効/無効状態すなわちenableの値に連動させるためには、OnDisable()、OnEnable()内でコルーチンを停止/再開させる必要があります。
これを実装すると以下のようになります。
using UnityEngine; using System.Collections; public class TimeCounter : MonoBehaviour { IEnumerator coroutine; // コルーチン呼び出し void Awake() { coroutine = ShowCounter(); } // 1秒ごとにカウンタをインクリメントして表示するコルーチン IEnumerator ShowCounter() { int count = 0; while ( true ) { // カウンタ値表示 Debug.Log(count++); // 1秒待機 yield return new WaitForSeconds(1); } } // コルーチン一時停止 void OnDisable() { StopCoroutine(coroutine); } // コルーチン再開 void OnEnable() { StartCoroutine(coroutine); } }
Start()などUnity側から呼び出されるメソッドをコルーチンとしている場合は戻り値を受け取る術が無いので別のメソッド名にしてAwake()内部で呼び出すようにしています。
これでスクリプトが無効になるとコルーチンが停止し、再び有効になるとコルーチンが途中から再開します。
コルーチンを途中から再開させるためにはStartCoroutine()にコルーチンの戻り値を指定します。
これでコルーチンがスクリプトの有効/無効状態に連動して動作/停止するようになりました。