🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

C#

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

Unity

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

Q&A

解決済

2回答

1106閲覧

unityでifがいっぺんに実行される

zxcvbnm

総合スコア5

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

C#

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

Unity

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

0グッド

0クリップ

投稿2019/11/24 11:41

前提・実現したいこと

unityでC#を使用しています。
2Dのゲームです。
ifやelse ifを使って、ゲームの状況によって違う処理をしたいのですが、
現状だとifやelse if に書いてあることが一度にすべて実行されてしまいます。

・実現したいこと
①画像がプレーヤーと接触しているときにスペースキーを押すと(1回目)画像が少し上がる。
②接触しているときに再度スペースキーを押すと(2回目)画像が少し上がる。
③接触しているときに再度スペースキーを押すと(3回目)画像が消える。

現状では、一度スペースキーを押すと①~③がいっぺんに実行されてしまいます。

初歩的な間違い/勘違いが原因なのだろうと思いますが、アドバイスをいただければ幸いです。

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

エラーは出ていません。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Pull: MonoBehaviour{ 6 7 private bool flag = false; 8 private bool spaceonce = false; 9 private bool spacetwice = false; 10 11  void OnTriggerStay2D(Collider2D col){ 12    if (col.gameObject.tag == "player"){ 13 if (Input.GetKeyDown(KeyCode.Space)){ 14 //以下の①-③が一度に実行されてしまいます。 15 if(spaceonce == false && spacetwice == false){ //① 16 transform.Translate(0.0f, 0.1f, 0.0f); 17 spaceonce = true; 18 } 19 else if (spaceonce == true && spacetwice == false){ //② 20 transform.Translate(0.0f, 0.1f, 0.0f); 21 spacetwice = true; 22 } 23 else if (spaceonce == true && spacetwice == true){ //③ 24 flag = true; 25 } 26  } 27    } 28    } 29  30 void Update(){ 31 if (flag){ 32 Destroy(this.gameObject); 33 } 34 } 35} 36

試したこと

処理の一部をUpdate内に書いてみたりしましたが、同じような挙動になってしまいました。

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

使用しているのはUnity 2019.3.0a8 (64-bit)です。

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

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

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

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

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

sakura_hana

2019/11/25 01:45

処理の全部(if (Input.GetKeyDown(KeyCode.Space)) の中身)をUpdateに書くとどうなりますか? (Update内でやるなら問題無いソースのように見えます)
zxcvbnm

2019/11/25 11:17 編集

OnTriggerStay2D内の if (Input.GetKeyDown(KeyCode.Space))以下をUpdateに移したところ、無事問題が解決いたしました! ありがとうございました。 ※追記 こちらの回答をベストアンサーにさせていただきたいので、回答として記載していただけるとありがたいです。お手数ですがよろしくお願いいたします。
guest

回答2

0

ベストアンサー

if (Input.GetKeyDown(KeyCode.Space)){ 〜 }をUpdate内に持っていきましょう。


■なぜこれだと動くのか
Input.GetKeyDownは「キー入力があった1フレームの間だけtrue」になります。
この1フレームとは「Update間隔(可変)」単位、つまりUpdate1回分です。
以下のような動きになるので正常に動作します。

  1. 最初にキー入力がされてInput.GetKeyDownがtrueになり①のif文に入る。
  2. 次のUpdateでInput.GetKeyDownがfalseになる(実際にキーが押されているかに関わらず)。
  3. 次にInput.GetKeyDownがtrueになるのはプレイヤーがキーを離し、再度押した時なので、そのタイミングで今度は②に入る。
  4. ③の時も同様。

一方OnTriggerStay2Dは「FixedUpdate間隔(固定)」で動作します。
Updateのフレームレート(fps)によっては、次のUpdateが来る前に複数回FixedUpdateが実行されることがあります。
(例えばUpdateが0.1秒間隔、FixedUpdateが0.02秒間隔だと、1回Updateが実行されるまでに5回のFixedUpdateが実行されます)
こうなると、以下のような挙動を取るので見た目上は①〜③がいっぺんに実行されているように見えます。

  1. 最初にキー入力がされてInput.GetKeyDownがtrueになり①のif文に入る。
  2. 次のOnTriggerStay2DでもInput.GetKeyDownがtrueになりっぱなし(次のUpdateが来ていない為Input.GetKeyDownがfalseにならない)のでそのまま②のif文に入る。
  3. ③も同様。

投稿2019/11/25 12:01

sakura_hana

総合スコア11427

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

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

zxcvbnm

2019/11/25 12:09

丁寧な解説までつけていただいて、ありがとうございました。
guest

0

なんかするとspaceonceがtrueになるのはわかるんですが、falseにしてるところがないので、
キーを押している間は えんえんと実行され続けてしまいますね

投稿2019/11/24 12:00

編集2019/11/24 12:13
y_waiwai

総合スコア88038

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

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

sakura_hana

2019/11/25 01:51

Input.GetKeyDownは「キーを押した1フレーム(Update周期)の間だけtrueになる」という動きをします。 ただInput検知頻度(Update周期)とOnTriggerStay2Dの頻度(FixedUpdate周期)のせいで、Inputがオンの間に数回OnTriggerStay2Dが発動している可能性はあります。 現状の回答文だと語弊がある(無条件に延々実行するように読める)ので一部訂正が必要かと思います。
zxcvbnm

2019/11/25 10:53

ご回答いただき、ありがとうございます。 OnTriggerStay2D内の if (Input.GetKeyDown(KeyCode.Space))以下をUpdateに移すことで解決いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問