0
\$\begingroup\$
  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 bool wasGrounded;
    [SerializeField] private float timeToNotGrounded = 0.3f;
    private float timeToNotGroundedTimer;
    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.



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


    private void FixedUpdate()
    {
        wasGrounded = 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;
                wasGrounded = true;
                timeToNotGroundedTimer = timeToNotGrounded;
            }
        }

        if (!wasGrounded)
        {
            timeToNotGroundedTimer -= Time.fixedDeltaTime;
            if (timeToNotGroundedTimer <= 0)
            {
                Debug.Log ("HAHAHAHA");
                m_Grounded = false;
            }
        }
        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(jump) Debug.Log (m_Grounded);
        // If the player should jump...
        if (m_Grounded && jump && m_Anim.GetBool("Ground"))
        {               
            // Add a vertical force to the player.
            wasGrounded = false;
            m_Grounded = false;
            m_Anim.SetBool("Ground", false);
            m_Rigidbody2D.velocity = new Vector2 (m_Rigidbody2D.velocity.x, 0);
            m_Rigidbody2D.AddForce(new Vector2(0f, m_JumpForce));
        }
    }

Hi Guys! :D I modified a bit PlatformerCharacter script from Standard Assets from Unity to make it possible to jump in mid air, like here : http://devmag.org.za/2011/01/18/11-tips-for-making-a-fun-platformer/ in point 4. I think everything is okey in code, but my character is double jumping and I can't realize why.

That's what i want to get - player can jump a small amount of time after he is not grounded

\$\endgroup\$
0
\$\begingroup\$

its a question that been asked a lot. if you search in internet you can find some good aproches but I count some of them here

1) make a trigger under legs of you character. define a Boolean onground variable ontriggerenter function it sets true and on ontriggerexit set it as false. so make character be able to jump only when grounded is true. you can set a layer or tag to make it only detect ground (I use this most of the times.)

2) use raycasting. raycast -transform.up with character length. when raycast is more than character length so it cant jump

3) if you use animation for jumping instead of physics like addforce you can set onground false when jump button pressed. on end of animation set it true.

\$\endgroup\$
  • \$\begingroup\$ Yes, i know and i already have a solution with boolean in the code above, i am using "OverlapCircleAll()" to check if player is grounded. And that worked till i changed the code to work like in point 4. of link that i left in my post and at picture i've just added. I made a variable for timer and i was going to let player jump about 0.3f seconds after he's not grounded. \$\endgroup\$ – GameDevMumin Oct 18 '17 at 14:27
  • \$\begingroup\$ Can you please elaborate on the pros and cons of each option? \$\endgroup\$ – Little Helper Aug 20 '18 at 10:44

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.