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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

2回答

4277閲覧

Unity でコルーチンを使った処理

seri

総合スコア422

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

0クリップ

投稿2016/05/27 01:12

編集2016/05/27 01:36

C#

1void Awake(){ 2 SRe(); 3 filter=true; 4 } 5 public static bool filter=false; 6 public static void SRe(){ 7 _S = 0; 8 } 9 10 public static void Sup(MonoBehaviour mon){ 11 if(filter){ 12 _S = _S + 1; 13 mon.StartCoroutine("filterscan"); 14 }} 15 16 public static IEnumerator filterscan(){ 17 filter=false; 18 yield return new WaitForSeconds(3); 19 filter=true; 20 } 21

外部からSup(this)と読み込み、_Sの値を増加させています。
ここまではいいのですが、Bool値のfilterがうまく作動しません。。なぜか理由もわからず、アドバイスお願いいたします。。

外部からSupを呼び出す度に、_Sが+1され、その後、_Sが+1されるまでの待ち時間を設けたいのです。

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

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

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

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

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

guest

回答2

0

public static IEnumerator filterscan(){ filter=false; yield return new WaitForSeconds(3); filter=true; }

上記にある```
yield return new WaitForSeconds(3);

書くとしたら、yield return文の前です。 回答としてはこんな感じになってしまいますが、もっとより具体的に質問を書くことをお勧めします。 そうすれば、よりアドバイスができますよ。

投稿2016/05/27 01:25

編集2016/05/27 01:26
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

seri

2016/05/27 01:31

試に、yieldの後の処理を消してみたところ'filterscan' couldn't be started!とゆうエラーが出てきました。
seri

2016/05/27 01:33

それと、普通、 yield return文の後の処理は実行しますよ、なぜ実行しないといいきれるのですか?
退会済みユーザー

退会済みユーザー

2016/05/27 03:19 編集

>試に、yieldの後の処理を消してみたところ'filterscan' couldn't be started!とゆうエラーが出てきました。 基本的にIEnumeratorはアップデートとして処理することが推奨されてるので、IEnumeratorの中にwhile文を書かないとこのようなエラーがでます。 >それと、普通、 yield return文の後の処理は実行しますよ、なぜ実行しないといいきれるのですか? 失礼しました。C#はどのバージョンをお使いですか?C#のバージョンによっては実行されません。もしかしたら新しいバージョンは実行されるでしょう。(もともとIEnumeratorの中にwhile文を使って処理をするのが一般的でした。)
guest

0

filter の初期値は false にしてあります

Supでコルーチンを開始するのは filter が true の時だけにしています

どこかで filter が true になるまで Sup を実行してもコルーチンは開始しません

提示されたソースの範囲内では filter が true になるのはコルーチンの処理が終了した時だけです

結局 Sup でのコルーチンは永遠に実行されません(filter が true になる事がないので)

投稿2016/05/27 01:17

HiroshiWatanabe

総合スコア2160

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

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

seri

2016/05/27 01:31

申し訳ありません。Awakeの処理をかき忘れていました。編集させていただきます
HiroshiWatanabe

2016/05/27 03:55

コルーチンの処理が継続中の間はコルーチンの再開をさせたくないって目的でfilterで制御してるって事ですよね? 手元で同様の事は出来ていますよ。 少し気になるのは… mon.StartCoroutine("filterscan"); ですがこの filterscan は mon に「ある」んですよね? Sup の引数でわざわざ受け取っている所が微妙に違和感あります。 Sup や filterscan があるクラスと mon の関係って正しく意図通りですか? mon.StartCoroutine("filterscan") なら filterscan は mon のクラスに「非staticで」存在しないといけないと思います。 構成(全体像)が見えないのでこれ以上詳しくはコメントしようが無いですが、その辺をもう1度確認してみてください。 正しく配置/利用すれば処理の中身自体は期待通りの結果になると思われます。 提示されたコードを元にstaticを外して手元で毎フレームSupを呼び出すよう実験してみるとコルーチンの3秒間はSupの中身はスキップされコルーチンの3秒が終わったらSupの呼び出しでコルーチンの開始がまた有効になり…を繰り返すのが確認できました。
HiroshiWatanabe

2016/05/27 04:03

もしかして mon.StartCoroutine("filterscan"); ではなく mon.StartCoroutine(filterscan()); でしょうか? これなら話し(static問題)のつじつまがあうような気が…?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問