質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1182閲覧

別のscriptのコルーチンの処理を止めたい

yuukuriuttto

総合スコア24

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/06/13 09:05

編集2018/06/17 15:24

前提・実現したいこと

Unityで3Dのゲームを制作しているのですが別のscriptのコルーチンの処理を止めて処理を行う前の状態にしたいです

正しいやり方や何か良い方法があれば教えていただきたいです。

発生している問題・エラーメッセージ

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class InterruptionButtonScr : MonoBehaviour { GameObject Coniferous; GameObject ActionButton; // Use this for initialization void Start() { Coniferous = GameObject.Find("Coniferous"); ActionButton = GameObject.Find("ActionButton"); } // Update is called once per frame void Update() { } public void OnClick() { ActionButton di = GetComponent<ActionButton>(); StopCoroutine("ExecutionTime"); } }

スタートコルーチンが書かれているscript

using UnityEngine; using System.Collections; using UnityEngine.UI; public class ActionButton : MonoBehaviour { public float _mb; public GameObject NotFixed; public GameObject DestroyButton; public GameObject GatheringButton; public GameObject StopProcessingButton; public GameObject Coniferous; public GameObject Branches; public float intarvar = 10.0f; Slider _slider; //中断するかどうかのフラグ public bool Interruption; //2倍減少中かのフラグ private bool boost = false; //標準の減少量 private float decreaseSpeed = 0.1f; void Start() { // スライダーを取得する _slider = GameObject.Find("CalorieSlider").GetComponent<Slider>(); StopProcessingButton.SetActive(false); } void Update() { if(boost) { _slider.value -= Time.deltaTime * decreaseSpeed * 10000.0f; } else { _slider.value -= Time.deltaTime * decreaseSpeed; } } public void OnClick() { //Coniferous = GameObject.Find("Coniferous"); //Renderer ConiferousRenderer = Coniferous.GetComponent<Renderer>(); //Destroy(Coniferous); StartCoroutine("ExecutionTime"); //ConiferousRenderer.enabled = false; //Instantiate(Branches, transform.position, Quaternion.identity); //DestroyButton.SetActive(false); //GatheringButton.SetActive(false); } IEnumerator ExecutionTime() { DestroyButton.SetActive(false); GatheringButton.SetActive(false); StopProcessingButton.SetActive(true); boost = true; yield return new WaitForSeconds(5.0f); boost = false; StopProcessingButton.SetActive(false); //Debug.Log("ok"); //GameObject.Find("DestroyButton").GetComponent<Image>().enabled = false; gameObject.SetActive(false); } }

試したこと

ボタンが押されたときにActionButtonスクリプトのコルーチンをStopCoroutine()で止まるはずが止まらず

補足情報(FW/ツールのバージョンなど)

Unity 2018.1.0f2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

StopCoroutine() では駄目ですか?

(コメントを受けて追記)
外部からというのは例えばこういうイメージです(直接関係ない部分は色々記載省略してます)

c#

1// コルーチンの動いてるクラス. 2public class ActionButton : MonoBehaviour { 3 private IEnumerator coroutine; 4 void Start() { 5 coroutine = ExecutionTime() 6 } 7 public void OnClick() { 8 StartCoroutine(coroutine);// コルーチンは自クラスで開始したい. 9 } 10 public void Stop() {// コルーチンの停止を外から呼び出したい. 11 StopCoroutine(coroutine);// コルーチン停止. 12 } 13 IEnumerator ExecutionTime() {// コルーチン. 14 () 15 } 16} 17// 自分以外のクラスで動いてるコルーチンをこのクラスから停止したい. 18public class InterruptionButtonScr : MonoBehaviour { 19 public void OnClick() { 20 ActionButton di = GetComponent<ActionButton>(); 21 if (di != null) { 22 di.Stop();// ActionButtonクラスで動いてるコルーチンをActionButtonのStopを呼び出す事で停止. 23 } 24 } 25}

投稿2018/06/13 09:20

編集2018/06/18 03:00
HiroshiWatanabe

総合スコア2160

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuukuriuttto

2018/06/14 02:17

試してみましたがどうやら別scriptでのStopCoroutine()は動かないようです
HiroshiWatanabe

2018/06/14 06:12

スクリプトA内でスクリプトAのStopCoroutineをする処理を用意してスクリプトBからそれを呼び出せばできますよね?
edo_m18

2018/06/16 09:20

コルーチン自体はスクリプトに依存していないので、StopCoroutineで止まると思います。 ただ、引数にStartCoroutineで生成した「Coroutineオブジェクト」を渡さないとならないのですが、どのようにStopCoroutineを呼び出しましたか? というか、今回のケースの場合は「別スクリプト側」に「コルーチンを止めるための処理」を書いておき、外部からは「Stop();」などとして、コルーチン自体を指定しなくてもいいようにしたほうがいいように思います。
yuukuriuttto

2018/06/17 15:42

外部からは・・・という部分がいまいちわからないのですが関数外からという意味でしょうか?
edo_m18

2018/06/18 01:24

コルーチンを実行しているクラスと、それを停止しようとしているクラスの2つが今回ありますよね? コルーチンを実行しているクラスの「外」から、つまり停止しようとしているクラスから、という意味です。
yuukuriuttto

2018/06/20 10:05

なるほど!なんとか実装することが出来ました。アドバイスありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問