頑張ってゲーム作ることにする #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にある説明がまさに躓いたポイントでした。

次回は敵キャラを作るのとプレイヤーの死亡を実装していこうと思います。