頑張ってゲーム作ることにする #3.5 キャラクターのジャンプを実装する2
前回なぜかジャンプボタン(スペース)が反応したりしなかったりしました。
それを何とか改良してみたところ、無事毎回確実に反応するようになりました。
反応しなかったのは自分がスペースを押したときにうまくフレームがかみ合っていないからだと考えました。
特に
FixedUpdate()
と
Update()
の違いについて理解する必要があると思われます。
こちらが改良したコードになります。
void Update() { if (Input.GetKeyDown("space") && groundCheck.IsGround()) { goJump = true; } } void FixedUpdate() { float x = Input.GetAxis("Horizontal"); isGround = groundCheck.IsGround(); if (x > 0)// move right { transform.localScale = new Vector2(1, 1); moveSpeed = MOVE_SPEED; Debug.Log("1"); } else if (x < 0) // move left { transform.localScale = new Vector2(-1, 1); moveSpeed = -1 * MOVE_SPEED; Debug.Log("-1"); } else { moveSpeed = 0; Debug.Log("0"); } rb.velocity = new Vector2(moveSpeed, rb.velocity.y); if (goJump) { rb.AddForce(Vector2.up * JUMP_POWER); goJump = false; } }
着目してほしいところが、
if (Input.GetKeyDown("space") && groundCheck.IsGround()) { goJump = true; }
この条件分岐の部分をUpdate関数の中に入れているところです。
物理演算というのは時間の概念が大事(移動距離の計算などがあるので)なので、フレームという概念の中にいません。フレームはフレームレートによって時間が変動してしまうので当てにならないのです。
その為、UpdateとFixedUpdateは呼ばれ方が違います。ここにちょっと問題があります。
Updateは入力と画面の更新に関係し、FixedUpdateは物理的な移動に関係がある事に注目してください。
物理演算というのは時間の概念が大事(移動距離の計算などがあるので)なので、フレームという概念の中にいません。フレームはフレームレートによって時間が変動してしまうので当てにならないのです。
その為、UpdateとFixedUpdateは呼ばれ方が違います。ここにちょっと問題があります。
Updateは入力と画面の更新に関係し、FixedUpdateは物理的な移動に関係がある事に注目してください。
https://dkrevel.com/makegame-beginner/make-2d-action-ground/
URLにある説明がまさに躓いたポイントでした。
次回は敵キャラを作るのとプレイヤーの死亡を実装していこうと思います。