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

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

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

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

Q&A

解決済

1回答

1995閲覧

Unity2Dにて、getkeydown処理が意図通りに行われるときと行われない時があります。

seto4718

総合スコア1

C#

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

0グッド

0クリップ

投稿2020/11/07 12:42

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
C#で2D山登りゲームを作っています。
「Z」キーを押すごとに少しずつ登る機能を実装中に以下の問題が発生し、困っています。

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

「Z」キーを押した(getkeydown)ときに、反応するときと反応しないときがあります。

該当のソースコード

C#

1void Update(){ 2 if (Input.GetKeyDown("z")){ 3a = true; 4} 5 6void FixedUpdate(){ 7if (a == true){ 8Vector3 playerPos = GameObject.Find("Player").transform.position; 9GameObject.Find("Player").transform.position = new Vector3(playerPos.x, playerPos.y + 0.3f, playerPos.z) 10}

試したこと

以下のスクリプトから書き直しましたが、依然として「Z」キーの反応がまちまちです。

C#

1if (Input.GetKeyDown("z")){ 2Vector3 playerPos = GameObject.Find("Player").transform.position; 3GameObject.Find("Player").transform.position = new Vector3(playerPos.x, playerPos.y + 0.3f, playerPos.z); 4}

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

Unity 2019.4.11f1 Personal

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

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

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

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

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

guest

回答1

0

ベストアンサー

FixedUpdate内でのGetKeyDownがいけないと考えての書き換えでしょうか(afalseに戻している箇所が見当たりませんが、実際は移動後にfalseに戻しているのかと思います)。
たとえば「[Unity] InputとFixedUpdateと物理演算の関係を整理しよう - Qiita」には

FixedUpdateが呼ばれる回数は、Updateが1回呼ばれる度に0回だったり1回だったり2回だったりn回だったりする!

との記述がありますが、逆に「FixedUpdateが1回呼ばれる間にUpdateが呼ばれる回数は0回かも1回かも2回以上かもしれない」とも言えると思います。
キーを押した回数と同じだけ移動させるとなると、下記のようにするとどうでしょうか?

C#

1using UnityEngine; 2 3public class Climber : MonoBehaviour 4{ 5 Transform playerTransform; 6 int inputCount; 7 8 void Start() 9 { 10 // 蛇足かもしれませんが、普通は1つのコードブロックの中でわざわざ何度も 11 // GameObject.Find("Player")を行わなくても問題ないように思いまして、 12 // Start内で一度だけPlayerを探しておく方式に変更しました 13 playerTransform = GameObject.Find("Player").transform; 14 } 15 16 void Update() 17 { 18 // キー入力があるたびに入力回数カウンターを1増やす 19 if (Input.GetKeyDown("z")) 20 { 21 inputCount++; 22 } 23 } 24 25 void FixedUpdate() 26 { 27 // 入力回数カウンターをすべて消費するまで繰り返し移動を行う 28 while (inputCount > 0) 29 { 30 Vector3 playerPos = playerTransform.position; 31 playerTransform.position = new Vector3(playerPos.x, playerPos.y + 0.3f, playerPos.z); 32 inputCount--; 33 } 34 } 35}

とはいえ、ご提示のコードを拝見する限りでは移動をFixedUpdateで行う必要性は感じられませんので、もしUpdateだけで処理するのでも問題なければ...

C#

1using UnityEngine; 2 3public class Climber : MonoBehaviour 4{ 5 Transform playerTransform; 6 7 void Start() 8 { 9 playerTransform = GameObject.Find("Player").transform; 10 } 11 12 void Update() 13 { 14 // キー入力があるたびに1回移動する 15 if (Input.GetKeyDown("z")) 16 { 17 Vector3 playerPos = playerTransform.position; 18 playerTransform.position = new Vector3(playerPos.x, playerPos.y + 0.3f, playerPos.z); 19 } 20 } 21}

としてしまうのが素直なように思います。

投稿2020/11/07 21:46

Bongo

総合スコア10811

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

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

seto4718

2020/11/14 11:24

Bongo様 ご回答ありがとうございます。お返事が1週間遅れてしまって申し訳ございません。 教えていただいたコードで意図通りの挙動を再現することができました。QiitaのFixedUpdateに関するページのご紹介も大変参考になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問