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

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

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

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

Unity

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

Q&A

解決済

1回答

2683閲覧

上キー押しっぱなしでもジャンプは一度だけにしたい

Ayber

総合スコア8

C#

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

Unity

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

0グッド

0クリップ

投稿2020/03/11 22:44

前提・実現したいこと

こちらのサイトを見ながら現在横スクロールアクションゲームを作っています。
https://dkrevel.com/makegame-beginner/make-2d-action-script-tidy

以下のようなコードでジャンプの挙動を実装し問題なく動くのですが、上キーを押しっぱなしにしていると
ずっとピョンピョンはね続けてしまいます。
押しっぱなしにしていてもジャンプは一度きりで、一度キーを離して再度押すまでジャンプしないようにするには
どうすればいいでしょうか?

該当のソースコード

C#

1 private float GetYSpeed() 2 { 3 float verticalKey = Input.GetAxisRaw("Vertical"); 4 float ySpeed = -gravity; 5 6 if (isGround) 7 { 8 if (verticalKey > 0 && jumpTime < jumpLimitTime) 9 { 10 ySpeed = jumpSpeed; 11 jumpPos = transform.position.y; 12 isJump = true; 13 jumpTime = 0.0f; 14 15 } 16 else 17 { 18 isJump = false; 19 20 } 21 } 22 else if (isJump) 23 { 24 if (verticalKey > 0 && jumpPos + jumpHeight > transform.position.y && jumpTime < jumpLimitTime && !isHead) 25 { 26 ySpeed = jumpSpeed; 27 jumpTime += Time.deltaTime; 28 } 29 else 30 { 31 isJump = false; 32 jumpTime = 0.0f; 33 34 } 35 } 36 if (isJump) 37 { 38 ySpeed *= jumpCurve.Evaluate(jumpTime); 39 } 40 return ySpeed; 41 }

試したこと

8行目の
if (verticalKey > 0 && jumpTime < jumpLimitTime)

if (Input.GetKeyDown("up") && jumpTime < jumpLimitTime)
にしてみると、ずっとはね続ける現象は無くなりましたがジャンプの高さが非常に小さくなってしまいました。

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

参考サイトでは3行目の
float verticalKey = Input.GetAxisRaw("Vertical");
は本来
float verticalKey = Input.GetAxis("Vertical");
になっていますが、それだと一度ボタンを押しただけで二度跳んでしまったり挙動が怪しかったので
変えていますが、それ以外はサイトに掲載されているコードと一緒です。
(ひとつ前に質問させて頂いた内容が類似する問題だったため、その時いただいた解決策をこっちにも適用
している状態です。)

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

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

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

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

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

guest

回答1

0

ベストアンサー

if (isGround) //これを

if (isGround && Input.GetButtonDown("Vertical")) //こうしてみてはいかがでしょう

解説を添えますと、
接地中に"上ボタン"が入力された瞬間のみジャンプ処理をするようにしただけです。

質問からそれますが、
"試したこと"を見た感じ操作の入力確認をGetKey系を使っているようですが、
本格的に作るときはGetButton、GetAxis系を使うといいですよ。

投稿2020/03/12 00:49

piced

総合スコア60

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

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

Ayber

2020/03/12 07:04

ご提案の通りにさせて頂いた結果、飛び跳ね続けることは無くなりましたが、たまに上キーを押しても無反応になる現象が起きました。 9~15行目の中にDebug.Logを入れてみると、無反応な時はLogも表示されませんでした。 8行目からverticalKey > 0 &&を削除しても現象は変わりません。 変更前は常に跳べていたので接地判定やAnimationのTransitionsの問題ではないと思うので、あとはverticalKey内部の数値の問題なのでしょうか...?
piced

2020/03/12 07:35

恐らくジャンプ処理がFixedUpdateの中にあるからだと思われます。 ジャンプ処理をUpdate内にしてあげればいいですよ。 これはUpdate()とFixedUpdate()の仕組みの差が原因になっています。 この際に調べてみるといいですよ。参考までにサイトをどうぞ: https://asterisks.netlify.com/2016/01/04/unity-input-getkeydown-fixedupdate/ https://qiita.com/yuji_yasuhara/items/6f50ecdd5d59e83aac99 無関係な話ですが、"移動"などの持続的な入力の処理をUpdate()の中で行うと、 移動がガタガタするかと思われます。 ジャンプや攻撃のような瞬間的な入力はUpdate()の中に、 移動などの持続的な入力はFixedUpdate()の中にするといいでしょう。
Ayber

2020/03/12 08:10

今までFixedUpdate内で一括で管理していた void FixedUpdate() { //接地判定を得る isGround = ground.IsGround(); isHead = head.IsGround(); //各種座標軸の速度を求める float xSpeed = GetXSpeed(); float ySpeed = GetYSpeed(); //アニメーションを適用 SetAnimation(); //移動速度を設定 rb.velocity = new Vector2(xSpeed, ySpeed); } のうち、 //各種座標軸の速度を求める float xSpeed = GetXSpeed(); float ySpeed = GetYSpeed(); //移動速度を設定 rb.velocity = new Vector2(xSpeed, ySpeed); を新たに作ったvoid Update内に入れたところ、無事解決致しました。 ただ仰られるようにジャンプ処理はUpdate()、移動処理はFixedUpdate()内で処理させるようにするなら、現在一括で設定している rb.velocity = new Vector2(xSpeed, ySpeed);はxSpeedとySpeedを分けて設定した方がいいということでしょうか? 初歩的な質問を何度も申し訳ありません。
piced

2020/03/12 08:45

私自身もまだまだ未熟者でして、良いかどうかはわかりかねますが、 分けて設定しても問題はないと思いますよ。 //このようにすればy方向の速度だけを設定できます。 rb.velocity = new Vector2(rb.velocity.x, ySpeed); またまた蛇足ですが、 ただ速度を設定する方法として、どんな風にゲームを作るかを予め考えておくと尚良いです。 例として、"爆発でプレイヤーを吹き飛ばしたいな"と考えている場合、 キャラのRigidBody2DをAddForce()で飛ばすのが簡単ですが、 上記の移動の処理方法ではキャラの速度を"再設定"してしまっているので 仮に爆発によるAddForceでx速度が500fになっても、 入力した瞬間に「x速度 = 横の移動速度」に戻されて飛ばせない、といったことが起こりえます。
Ayber

2020/03/12 08:52

ここまで長くお付き合いいただいた上、丁寧かつ迅速な回答を本当にありがとうございます。頂いた助言とサイトもしっかり読んだ上で、今後に反映させていこうと思います。 改めてこの度は誠にありがとうございました。
piced

2020/03/12 09:17

頑張ってくださいな! (`・ω・´)b
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問