Player can't jump

My player can jump, anyway to fix? Here is my code:

using UnityEngine;

namespace UnityStandardAssets._2D
{
    public class PlatformerCharacter2D : MonoBehaviour
    {
        [SerializeField] private float m_MaxSpeed = 10f;                    // The fastest the player can travel in the x axis.
        [SerializeField] private float m_JumpForce = 400f;                  // Amount of force added when the player jumps.
        [Range(0, 1)] [SerializeField] private float m_CrouchSpeed = .36f;  // Amount of maxSpeed applied to crouching movement. 1 = 100%
        [SerializeField] private bool m_AirControl = false;                 // Whether or not a player can steer while jumping;
        [SerializeField] private LayerMask m_WhatIsGround;                  // A mask determining what is ground to the character

        private Transform m_GroundCheck;    // A position marking where to check if the player is grounded.
        const float k_GroundedRadius = .2f; // Radius of the overlap circle to determine if grounded
        private bool m_Grounded;            // Whether or not the player is grounded.
        private Transform m_CeilingCheck;   // A position marking where to check for ceilings
        const float k_CeilingRadius = .01f; // Radius of the overlap circle to determine if the player can stand up
        private Animator m_Anim;            // Reference to the player's animator component.
        private Rigidbody2D m_Rigidbody2D;
        private bool m_FacingRight = true;  // For determining which way the player is currently facing.
        public bool wallSliding;
        public Transform wallCheckPoint;
        public bool wallCheck;
        public LayerMask wallLayerMask;
        public bool grounded;

        Transform playerGraphics;

        private void Awake()

        {
            // Setting up references.
            m_GroundCheck = transform.Find("GroundCheck");
            m_CeilingCheck = transform.Find("CeilingCheck");
            m_Anim = GetComponent<Animator>();
            m_Rigidbody2D = GetComponent<Rigidbody2D>();
            playerGraphics = transform.FindChild("Graphics");
            if (playerGraphics == null)
            {
                Debug.LogError("Lets freak out! There is no 'Graphics' object of the player");
            }

            if (!m_Grounded)
            {
                wallCheck = Physics2D.OverlapCircle(wallCheckPoint.position, 0.29f, wallLayerMask);

                if (m_FacingRight && Input.GetAxis("Horizontal") > 0.1f || !m_FacingRight && Input.GetAxis("Horizontal") < 0.1f)
                {
                    if (wallCheck)
                    {
                        HandleWallSliding();
                    }
                }

            }



            if (wallCheck == false || grounded)
            {
                wallSliding = false;
            }


        }

        void HandleWallSliding()
        {

            m_Rigidbody2D.velocity = new Vector2(m_Rigidbody2D.velocity.x, -0.7f);

            wallSliding = true;

            if (Input.GetButtonDown("Jump"))
            {
                if (m_FacingRight)
                {
                    m_Rigidbody2D.AddForce(new Vector2(-1, 2) * m_JumpForce);
                }
                else
                {
                    m_Rigidbody2D.AddForce(new Vector2(1, 2) * m_JumpForce);
                }
            }

        }

        private void FixedUpdate()
        {
            m_Grounded = false;

            // The player is grounded if a circlecast to the groundcheck position hits anything designated as ground
            // This can be done using layers instead but Sample Assets will not overwrite your project settings.
            Collider2D[] colliders = Physics2D.OverlapCircleAll(m_GroundCheck.position, k_GroundedRadius, m_WhatIsGround);
            for (int i = 0; i < colliders.Length; i++)
            {
                if (colliders[i].gameObject != gameObject)
                    m_Grounded = true;
            }
            m_Anim.SetBool("Ground", m_Grounded);

            // Set the vertical animation
            m_Anim.SetFloat("vSpeed", m_Rigidbody2D.velocity.y);
        }


        public void Move(float move, bool crouch, bool jump)
        {
            // If crouching, check to see if the character can stand up
            if (!crouch && m_Anim.GetBool("Crouch"))
            {
                // If the character has a ceiling preventing them from standing up, keep them crouching
                if (Physics2D.OverlapCircle(m_CeilingCheck.position, k_CeilingRadius, m_WhatIsGround))
                {
                    crouch = true;
                }
            }

            // Set whether or not the character is crouching in the animator
            m_Anim.SetBool("Crouch", crouch);

            //only control the player if grounded or airControl is turned on
            if (m_Grounded || m_AirControl)
            {
                // Reduce the speed if crouching by the crouchSpeed multiplier
                move = (crouch ? move*m_CrouchSpeed : move);

                // The Speed animator parameter is set to the absolute value of the horizontal input.
                m_Anim.SetFloat("Speed", Mathf.Abs(move));

                // Move the character
                m_Rigidbody2D.velocity = new Vector2(move*m_MaxSpeed, m_Rigidbody2D.velocity.y);

                // If the input is moving the player right and the player is facing left...
                if (move > 0 && !m_FacingRight)
                {
                    // ... flip the player.
                    Flip();
                }
                    // Otherwise if the input is moving the player left and the player is facing right...
                else if (move < 0 && m_FacingRight)
                {
                    // ... flip the player.
                    Flip();
                }
            }
            // If the player should jump...
            if (m_Grounded && jump && m_Anim.GetBool("Ground"))
            if (Input.GetButtonDown("Jump") && !wallSliding)
            {
                // Add a vertical force to the player.
                m_Grounded = false;
                m_Anim.SetBool("Ground", false);
                m_Rigidbody2D.AddForce(new Vector2(0f, m_JumpForce));

                }
        }


        private void Flip()
        {
            // Switch the way the player is labelled as facing.
            m_FacingRight = !m_FacingRight;

            // Multiply the player's x local scale by -1.
            Vector3 theScale = playerGraphics.localScale;
            theScale.x *= -1;
            playerGraphics.localScale = theScale;
        }
    }
}

I think it is the reason for GetButtonDown()
Input.GetButtonDown
static function GetButtonDown (buttonName : string) : bool
Description
Returns true during the frame the user pressed down the virtual button identified by buttonName.
You need to call this function from the Update function, since the state gets reset each frame. It will not return true until the user has released the key and pressed it again.
Use this only when implementing action like events IE: shooting a weapon. Use Input.GetAxis for any kind of movement behaviour.

My player now jumps but he carries on jumping to the left side, the player never falls to the ground and so I can jump forever without hitting the floor.

“Player Can’t jump”
Is he white? There is a whole movie about that.

1 Like

Just need to set a flag that is set when you initiate the jump action and isn’t reset until your player touches the ground again.

But the player never falls back to the ground.

Have a look at your ‘jump’ method. Is it adding a force to the player? The method should check if the player is in the jumping state (or a state for not being on the ground). If the player is in the jumping state, it shouldn’t do anything. This means that when the jump button is pressed, it can only add forces once which will a be finite burst of upwards momentum.

Thanks for helping me, but I decided to to get a back up version of the platformer character 2D script and it works fine now. Though how could I add wall jumping?

You could create a separate Boolean to check against that is made true when you are in the air and touch a wall. You could then initiate a co-routine that sets the boolean to false after a set period of time.

When the player presses the jump button, you could check if this boolean is true and do the wall jump. If that is false, then you do your usual jump checking (is on the ground etc).

Thanks.