実現したいこと
こちらのサイト( https://dkrevel.com/makegame-beginner/make-2d-action-jump/ )を参考に、以下のスクリプトを作成しました。
キーボードの左右キーで左右に移動、上キーでジャンプするといったスクリプトとなっているのですが、上キーを押しっぱなしにしていると、アタッチしたオブジェクトがプカプカ浮かんでいるような動きになってしまい、困っています。
上キーを押された瞬間のみジャンプし、長押ししていても地面に着地した状態のままで、一度上キーを離してからでないとジャンプできないようにしたいのですが、なにか有効な方法はありませんでしょうか?
発生している問題・分からないこと
上方向のキーを入力したままにしていると、プカプカと浮かんでいるような動きになってしまう。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class MapPlayerCtrl : MonoBehaviour 6{ 7 ~(省略)~ 8 9 void Update() 10 { 11 isGround = ground.IsGround(); 12 isHead = ground.IsGround(); 13 14 float horizontalKey = Input.GetAxis("Horizontal"); 15 float verticalKey = Input.GetAxis("Vertical"); 16 float xSpeed = 0.0f; 17 float ySpeed = -gravity; 18 19 if (isGround) 20 { 21 if (verticalKey > 0 && beforeVerticalKey == 0.0f) 22 { 23 ySpeed = jumpSpeed; 24 jumpPos = transform.position.y; 25 isJump = true; 26 jumpTime = 0.0f; 27 } 28 else 29 { 30 isJump = false; 31 } 32 } 33 else if (isJump) 34 { 35 bool pushUpKey = verticalKey > 0; 36 bool canHeight = jumpPos + jumpHeight > transform.position.y; 37 bool canTime = jumpLimitTime > jumpTime; 38 39 if (pushUpKey && canHeight && canTime && !isHead && beforeVerticalKey == 0.0f) 40 { 41 ySpeed = jumpSpeed; 42 jumpTime += Time.deltaTime; 43 } 44 else 45 { 46 isJump = false; 47 jumpTime = 0.0f; 48 } 49 } 50 beforeVerticalKey = verticalKey; 51 52 ~(省略)~ 53 54} 55
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
こちらのサイト( https://teratail.com/questions/131818 )を参考に、別途float型のクラス変数を作成する方法を試してみましたが、ジャンプそのものができなくなるという結果になってしまいました。
補足
特になし
私は Unity 知らない人ですが…
> 実現したいこと
に書かれている内容と,提示されているコードの記述とが全然違っているように見えるのは気のせいなんでしょうか?
(話的にはジャンプ中にキーの状態を見る必要性は無さそうに思えるが,何やらジャンプ中にキー状態を条件とした処理が書かれているように見える??)
各 if の条件に用いられている変数が どんな状況ではどんな値になっているものなのか というあたりの話を一度整理してみてはどうでしょう?
あと,コードを示す時には各所が何の処理をしているのかコメントか何かで説明すると良いかと思います.
(特に, 所望の動作をしていない=間違っている可能性が高い コードを示す場合,「コードを見たらわかるだろ.勝手に読み取れ」とは言えないでしょうし)
> 一度ボタンを押してジャンプしたら、着地してから再度ボタンを押された際にのみジャンプできるようにしたい
この話だけから単純に考えれば,
{現時刻でのボタン状態,1つ前の時刻でのボタン状態,接地しているか否か}の3状態の組み合わせパータン(全8通り)について,それぞれ何が行われるべきなのかを整理してみれば良いのではないでしょうか.
↓
で,最も原始的には その結果をそのまま8通りに分岐するコードとして実装してやればよいです.
(もちろん,「いくつかのパターンでは同じことを行う」という話があるならば,そこは相応にまとめたコードにできるでしょう)
実際には上記の3状態だけは不足であり何かさらに追加の(例えば「ジャンプ中」等の)考えるべき状態が存在するのだとしても,話としては同様です.
1. ジャンプ系などの処理はrigid bodyを介するのが一般的です
2. GetKeyDownを使えば「入力した瞬間のみ限定で呼ばれる」処理を実現可能です
3. 着地しているかどうかはOnCollisionEnterとExitを使ってbool変数を操作すると楽に判定できます
あなたの回答
tips
プレビュー