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

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

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

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

Unity

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

Q&A

解決済

1回答

3085閲覧

coroutineでのwaitforsecondsの動作について

puika

総合スコア8

C#

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

Unity

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

0グッド

0クリップ

投稿2017/09/07 13:43

編集2017/09/08 10:45

こんばんは
プログラミング初心者です。

MoveEnemies()というコルーティーンで二箇所WaitForSecondsを挿入したい部分があるのですが、下の配置以外ではうまく動作が止まらず、プレイヤーが暴走します。

IEnumerator MoveEnemies() { enemiesTurn = true; yield return new WaitForSeconds(turnDelay); playersTurn = true; enemiesTurn = false; }

例えば、次のような配置は何がおかしいのでしょうか。

IEnumerator MoveEnemies() { yield return new WaitForSeconds(turnDelay); enemiesTurn = true; yield return new WaitForSeconds(turnDelay); playersTurn = true; enemiesTurn = false; }

ご回答ありがとうございます。プレイヤー側のこの部分に関する一連のソースは次の通りです。
なお、暴走するのは十字キーを長押しした時です。どうやらplayerはturnDelay一回分停止したのちturnDelay一回分暴走するという挙動をしているようです。不思議なのはキーを押した最初のターンはしっかり止まってくれることです。

// Playerというスクリプト上のUpdateと呼び出す関数 private void Update () { if (!playersTurn) playersTurn = gameScript.playersTurn; if (!playersTurn) return; horizontal = (int)Input.GetAxisRaw ("Horizontal"); vertical = (int)Input.GetAxisRaw ("Vertical"); if (horizontal != 0 || vertical != 0) { AttemptMove (horizontal, vertical, false); } } protected override void AttemptMove (int xDir, int yDir, bool isEnemy) { base.AttemptMove (xDir, yDir, isEnemy); playersTurn = false; gameScript.ChangePlayersTurn (); //上のMoveEnemies()が属するスクリプトでplayersTurnをfalseにする関数です。 } // MoveEnemiesを呼び出すのはMoveEnemiesと同じスクリプト上の次の関数です。 void Update () { if (!playersTurn && !enemiesTurn) { StartCoroutine (MoveEnemies ()); } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

このソースだけだと、よく分かりません。
プレイヤーが爆走するとのことですが、プレイヤーのソースはどのようになっておりますか?

なので、直感で答えますが、後者のソースでは、turnDelay秒待ってからenemiesTurn = true;しているので、それまでの間にプレイヤーの処理が無効になってないため、暴走が起こっている、と考えられます。


編集を受けて追記:

C#

1// MoveEnemiesを呼び出すのはMoveEnemiesと同じスクリプト上の次の関数です。 2 void Update () 3 { 4 if (!playersTurn && !enemiesTurn) { 5 StartCoroutine (MoveEnemies ()); 6 } 7 }

上記だと、playersTurnとenemiesTurnが共にfalseのとき、毎フレームごとにMoveEnemies ()が開始されてしまいます。
前者のコルーチンでは、直ちにenemiesTurn = true;にしているため、この問題は起きなかったかと思いますが、後者はturnDelay秒の間、playersTurnとenemiesTurnが共にfalseになっているので、その間に大量のMoveEnemies ()が開始されることになります。
そのため、playersTurnをfalseに切り替えても、残ったMoveEnemies ()によって勝手にtrueに戻ってしまい、バグが発生したのだと思います。

投稿2017/09/08 03:51

編集2017/09/08 13:34
fiveHundred

総合スコア9801

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

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

puika

2017/09/08 14:07

二度もの回答本当にありがとうございます!! おかげさまで原因がわかり無事に動かすことができました。 MoveEnemies()が起動しているかどうかというboolを設定し、MoveEnemies()が複数重なって起動しないように致しました。 助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問