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

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

ただいまの
回答率

90.52%

  • Unity

    3978questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1286questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 270

yuukuriuttto

score 16

 前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

StopCoroutine() では駄目ですか?

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

// コルーチンの動いてるクラス.
public class ActionButton : MonoBehaviour {
  private IEnumerator coroutine;
  void Start() {
    coroutine = ExecutionTime()
  }
  public void OnClick() {
     StartCoroutine(coroutine);// コルーチンは自クラスで開始したい.
  }
  public void Stop() {// コルーチンの停止を外から呼び出したい.
    StopCoroutine(coroutine);// コルーチン停止.
  }
  IEnumerator ExecutionTime() {// コルーチン.
    (略)
  }
}
// 自分以外のクラスで動いてるコルーチンをこのクラスから停止したい.
public class InterruptionButtonScr : MonoBehaviour {
  public void OnClick() {
    ActionButton di = GetComponent<ActionButton>();
    if (di != null) {
      di.Stop();// ActionButtonクラスで動いてるコルーチンをActionButtonのStopを呼び出す事で停止.
    }
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/14 11:17

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

    キャンセル

  • 2018/06/14 15:12

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

    キャンセル

  • 2018/06/16 18:20

    コルーチン自体はスクリプトに依存していないので、StopCoroutineで止まると思います。
    ただ、引数にStartCoroutineで生成した「Coroutineオブジェクト」を渡さないとならないのですが、どのようにStopCoroutineを呼び出しましたか?

    というか、今回のケースの場合は「別スクリプト側」に「コルーチンを止めるための処理」を書いておき、外部からは「Stop();」などとして、コルーチン自体を指定しなくてもいいようにしたほうがいいように思います。

    キャンセル

  • 2018/06/18 00:42

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

    キャンセル

  • 2018/06/18 10:24

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

    キャンセル

  • 2018/06/20 19:05

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

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Unity

    3978questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1286questions

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