Able to jump in air? (Reward)

Hi, I am making a 2D game, and for some reason my player is able to jump while in the air. I don’t want the player to. The player should only be able jump once, then able to jump again, when he lands on the GROUND. I am using the scripts from Unity Standard Assets, but edited some of them.

Here are the scripts that I think are relevant to my problem:

using System;
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

// Just in case so no "duplicate definition" stuff shows up
namespace UnityStandardAssets.Copy._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.
        [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
        public bool m_Grounded;            // Whether or not the player is grounded.
        private Animator m_Anim;            // Reference to the player's animator component.
        private Rigidbody2D m_Rigidbody2D;
        private bool m_FacingRight = true;
		public string GameOverScene;
		// For determining which way the player is currently facing.

        private void Awake()
        {
            // Setting up references.
            m_GroundCheck = transform.Find("GroundCheck");
            m_Anim = GetComponent<Animator>();
            m_Rigidbody2D = GetComponent<Rigidbody2D>();
        }


        private void FixedUpdate()
        {
			m_Grounded = true;
            // 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*.gameObject != gameObject)*

m_Grounded = true;
}
m_Anim.SetBool(“Ground”, m_Grounded);
}

public void Move(float move, bool jump)
{
//only control the player if grounded or airControl is turned on
if (m_Grounded || m_AirControl)
{
// 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);

m_MaxSpeed += 0.5f * Time.deltaTime; /////////////////////////////////////////////////////////////////////////////////

m_JumpForce += 1.0f * Time.deltaTime; ////////////////////////////////////////////////////////////////////////////////

m_Rigidbody2D.gravityScale += 0.009f * Time.deltaTime; /////////////////////////////////////////////////////////////

// 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 = true && jump && m_Anim.GetBool("Ground"))*
    

{
// Add a vertical force to the player.
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 = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}

  •  void OnCollisionEnter2D(Collision2D target)*
    
  •  {*
    
  •  	if (target.gameObject.tag == "Enemy") {*
    
  •  		m_MaxSpeed = 0f;*
    
  •  		m_JumpForce = 0f;*
    
  •  		m_Rigidbody2D.gravityScale = 20f;*
    
  •  	}*
    

}

  •  IEnumerator DelayedSceneLoad()*
    
  •  {*
    
  •  	yield return new WaitForSeconds(1.5f);*
    
  •  	SceneManager.LoadScene(GameOverScene);*
    
  •  }*
    

}

}
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

// Just in case so no “duplicate definition” stuff shows up
namespace UnityStandardAssets.Copy._2D
{
[RequireComponent(typeof (PlatformerCharacter2D))]
public class Platformer2DUserControl : MonoBehaviour
{
private PlatformerCharacter2D m_Character;

  •  private bool m_Jump;*
    

private void Awake()
{
m_Character = GetComponent();
}

private void Update()
{
if (!m_Jump)
{
// Read the jump input in Update so button presses aren’t missed.

  •  		m_Jump = CrossPlatformInputManager.GetButtonDown("Jump");*
    

}
}

private void FixedUpdate()
{

  •  	float h = CrossPlatformInputManager.GetAxis("Horizontal");*
    

// Pass all parameters to the character control script.
m_Character.Move(h, m_Jump);
m_Jump = false;
}
}
}
Anyone that helps will be rewarded with karma/reputation points, just to be nice. :slight_smile:

Can you provide some example code where you define this method and register it as an event handler? Can you verify that the script is in an [Editor compilation pass][1] (i.e. in an Editor folder)? [1]: https://docs.unity3d.com/Manual/ScriptCompileOrderFolders.html

1 Answer

1

Hey. I believe, that line is the problem.

private void FixedUpdate()
{
    m_Grounded = true;
    ...
}

You indicate that your character is grounded on every update, which means he can jump at any time, isn’t that the case?

Found another possible problem. That place:

         if (m_Grounded = true && jump && m_Anim.GetBool("Ground"))
         {
             // Add a vertical force to the player.
             m_Anim.SetBool("Ground", false);
             m_Rigidbody2D.AddForce(new Vector2(0f, m_JumpForce));
         }

Try setting

         m_Grounded = false;

Right after the comment. If it doesn’t work, it’s probably due to the fact a character is registered as landed after a jump, before he could get far away from the ground. If you will reduce the k_GroundedRadius constant, you could check if that’s the case.

@Tianara I took away the line of code, and also tried setting it to false, but nothing happened.

Hm. So far nothing. Should I add lines of code, or take away?

@Cherno @Aggerwal @duck @3dmodler @wojtask12 @UsmanAbbasi @tanoshimi @Johat @Gaming Dudester @RealityStudio @Glurth @gsaccone101 @Dog Gamer @Roxzy @beechnova @MD_Reptile @rokmarko @SolAZDev @Ali hatem Could anyone one of you guys help me? I'm giving out karma/reputation points for anyone who helps.

@Tianara I will give you points now. Thank you for trying to help. Any more ideas are appreciated.

@Tianara I'll send to you through dropbox, give me your email, and i'll send it in a compressed file.