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

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

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

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

Q&A

解決済

1回答

1604閲覧

Unity2D AddForce()の数値が勝手に変わる?原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2019/03/25 04:21

提示コードのコメント部「//ジャンプ」なのですがスペースボタンを押しっぱなしにするとピョンピョンとジャンプするのですがその時に数回に一回かランダムの確立で高くジャンプしてしまい結果、ジャンプの挙動が二種類?にランダムに切り替わるようになってしまいますこれはなぜでしょうか?
原因と修正方法を教えてくれますでしょうか?

Player.cs

1public class PlayerController : MonoBehaviour { 2 3 public float JumpForce = 250.0f; 4 public float speed = 0.5f; 5 private bool isJump; 6 private bool isRun; 7 private bool isGround; 8 private Animator animator; 9 [SerializeField] ContactFilter2D filter2d; 10 11 // Use this for initialization 12 void Start () { 13 14 15 animator = GetComponent<Animator>(); 16 isJump = false; 17 isRun = false; 18 // isGround = false; 19 } 20 21 22 // Update is called once per frame 23 void Update () { 24 int key = 0; 25 26 //if(transform.position.y < ) 27 28     //ジャンプ 29 if(Input.GetKey(KeyCode.Space)) 30 { 31 32 if (!isJump) 33 { 34 GetComponent<Rigidbody2D>().AddForce(new Vector2(0, JumpForce)); 35 animator.SetBool("Jump",true); 36 isJump = true; 37 } 38 } 39 40 if(isJump == false) 41 { 42 animator.SetBool("Jump",false); 43 } 44 45 if (Input.GetKey(KeyCode.RightArrow)) 46 { 47 key = 1; 48 transform.Translate(Vector3.right * speed); 49 50 if(isRun == false && isJump == false) 51 { 52 animator.SetBool("Run",true); 53 54 } 55 } 56 57 58 59 if (Input.GetKey(KeyCode.LeftArrow)) 60 { 61 key = -1; 62 transform.Translate(Vector3.left * speed); 63 64 if(isRun == false && isJump == false) 65 { 66 animator.SetBool("Run",true); 67 } 68 } 69 70 if(key == 0 || isJump == true) 71 { 72 isRun = false; 73 animator.SetBool("Run",false); 74 } 75 76 77 if(key != 0) 78 { 79 transform.localScale = new Vector3(key,1,1); 80 } 81 82 //地面チェック 83 if (GetComponent<Rigidbody2D>().IsTouching(filter2d)) 84 { 85 isJump = false; 86 // isGround = true; 87 } 88 } 89 90 private void OnCollisionEnter2D(Collision2D collision) 91 { 92 isJump = false; 93 // isGround = true; 94 95 } 96}

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

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

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

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

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

guest

回答1

0

ベストアンサー

考えられるのは、想定外のタイミングでisJumpがfalseになり、
最初の力(AddForce)が残った状態のままもう一度力を加える(AddForce)ことで、結果的に過剰にジャンプしているのではないかと思います。

あり得そうなのは、「最初のフレーム→AddForce実行→上昇開始前に地面チェック実行→上昇開始前なので接地していてisJumpがfalseになる→次フレーム→isJumpがfalseなので再度AddForce実行」とかですね。
Debug.Logを仕込んで何が起こっているのか確認する、Updateの代わりにFixedUpdateを使う、地面チェックをAddForce判定の前に行う等を試してみてください。

投稿2019/03/25 04:33

sakura_hana

総合スコア11425

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

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

退会済みユーザー

退会済みユーザー

2019/03/26 04:46

質問ですが提示コードはAddForce()もUpdate()内で書いていますが本当はFixed Update()に記入したほうがいいのでしょうか?Input系のものはUpdateのほうがいいと調べたのでMove()関数などを使って値を渡すことを考えたほうが正解なのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問