Unity;C#についての質問です

Unity;C#についての質問です 2Dでプレイしています転がってきたものにぶつかると慣性でスライドする性質と、地面と接しているときにスペースキーを押すとジャンプすることができる性質を両立させたいのですがスクリプトの書き方が悪く、ジャンプはできるのですが何かにぶつかってもほとんど動かなくなってしまいました。初心者で効率の悪そうなスクリプトな気がするので改善点があれば教えて欲しいです!よろしくお願いします!見辛くてすみません… 以下スクリプトです using System.Collections; using System.Collections.Generic; using UnityEngine; public class RedBallScript : MonoBehaviour { //関数 bool jumpFlag = false; bool groundFlag = false; bool pushFlag = false; Rigidbody2D rb; private void Start() { rb = GetComponent<Rigidbody2D>(); } //ジャンプのフラグ管理 void Update() { if(Input.GetKey(KeyCode.Space) && groundFlag) { if(pushFlag == false) { jumpFlag = true; pushFlag = true; } } else { pushFlag = false; } } //速度の管理 private void FixedUpdate() { rb.velocity = new Vector2(0, rb.velocity.y); if (jumpFlag) { jumpFlag = false; rb.AddForce(new Vector2(0, 5), ForceMode2D.Impulse); } } //地面と接しているかのフラグ private void OnTriggerEnter2D(Collider2D collision) { groundFlag = true; } private void OnTriggerExit2D(Collider2D collision) { groundFlag = false; } }

C言語関連9閲覧xmlns="http://www.w3.org/2000/svg">100

ベストアンサー

0

まず、GetKeyはキーを押し続けている間実行されます。 つまり、1秒24フレームとして0.5秒押すと、 1フレーム目:pushflagがfalseからtrueに 2:elseの方の処理でpushflagがtrueからfalseに 3:falseからtrueに 4:elseで…というのが12フレーム繰り返されることになります。 GetKeyDownにすることにより、キーを押しこんだ時だけ実行されるようになります。 次に地面との判定ですが、OnTrigger系メソッドは貫通する(isTriggerにチェックを入れている)オブジェクトとの衝突判定時に呼び出されるメソッドです。床に貫通はつけていないと思うので、OnCollision系を使いましょう(床の上に貫通する空オブジェクトを作成しているのなら上の発言は無視してください)。 また、今のままだと床以外のオブジェクトに当たったり離れたりしたときにもメソッドが実行されて、フラグが切り替わってしまいます。引数になっているcollisionが当たってきたオブジェクトのコライダーなので、collision.gameObject.tagやcollision.gameObject.nameなどで情報を取得し、if文でぶつかったor離れたオブジェクトが「床だった場合」のみフラグの変更が行われると良いです。

ThanksImg質問者からのお礼コメント

色々調べて試しているうちに別の形で出来てしまったのですっかり質問したことを忘れてしまいましたすみません! 具体的に教えていただきありがとうございます!

お礼日時:9/23 22:18