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

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

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

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

Q&A

解決済

1回答

10984閲覧

UnityでStartCoroutineした処理を中止したい

yrema

総合スコア286

Unity

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

0グッド

0クリップ

投稿2018/06/17 05:38

編集2018/06/17 05:39

タイトルのとおりですが、以下のようにスペースキーを押すと、フルーツと野菜のリストを交互に入れ替えて名前をログ出力するだけの処理です。
イメージ説明
ここで、表示処理がすべて終わらないうちにスペースキーを押すと、
StopCoroutine(showName())をしているにも関わらず、
画像のようにInvalidOperationExceptionが発生してしまいます。
中止しているように見えて中止していないのでしょうか?解決する方法はないでしょうか?

c#

1public class TestScript : MonoBehaviour { 2 private List<string> mList; 3 private bool mFruitOn = true; 4 private string[] fruits = new string[] {"りんご", "みかん", "バナナ"}; 5 private string[] vegetables = new string[] {"キャベツ", "にんじん", "トマト"}; 6 7 void Start () { 8 mList = new List<string>(); 9 } 10 11 void Update () { 12 if (Input.GetKeyUp(KeyCode.Space)) { 13 Debug.Log ("★Spaceを押した"); 14 // 非同期の表示処理を中止 15 StopCoroutine(showName()); 16 // リストを一旦削除 17 mList.Clear(); 18 // 入れ直す 19 if (mFruitOn) { 20 foreach (string name in fruits) { 21 mList.Add(name); 22 } 23 } else { 24 foreach (string name in vegetables) { 25 mList.Add(name); 26 } 27 } 28 mFruitOn = !mFruitOn; 29 // 非同期で表示処理 30 StartCoroutine(showName()); 31 } 32 } 33 /** 34 * 1秒ずつ名前を出力 35 */ 36 private IEnumerator showName() { 37 foreach (string name in mList) { 38 // 処理 39 Debug.Log (name); 40 yield return new WaitForSeconds(1f); 41 } 42 } 43 44}

◆環境
Unity2017 3.1f1

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

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

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

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

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

guest

回答1

0

ベストアンサー

割とトラップなんですが、その方法だと止まりません。(中止しているように見えて中止していない)

StopCoroutine("showName");のように文字列で指定するか(StartCoroutine側も文字列指定の必要あり)、
Coroutine型を渡すか、
IEnumeratorを一度変数に入れるか、になります。
StopCoroutine() is not stopping my coroutines - Unity Answers
StopCoroutineではコルーチンは完全に止まらない - Qiita

投稿2018/06/17 05:47

編集2018/06/17 06:10
sakura_hana

総合スコア11425

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

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

yrema

2018/06/17 06:05

> StopCoroutine("showName");のように文字列で指定する これは変化がありませんでした。 > IEnumeratorを一度変数に入れる これで解決しました。ありがとうございます。
sakura_hana

2018/06/17 06:09

文字列で指定する場合、StartCoroutine側も文字列で呼ばないとダメなのでその所為だと思います。 回答補足しときます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問