Search code examples
c#unity-game-enginegame-engine

Is there a way to hold to long jump in Unity with a touchInput button?


I'm making a game and I want jumping to feel like jumping in Super Mario Bros. I'm able to get the result I want with a Keyboard or a Controller because they have KeyDown, Key (While pressed), and KeyUp. But touchButtons only have a single boolean. (Pressed or Not Pressed) Is there a way I can work around this?

I tried using Input.GetTouch and using the begin and end phase, this gave the correct result but I'm not sure how to implement it into a GUI button.

The code I'm using has a GUI button with a script that when the button is pressed, joybutton.Pressed = true

void PlayerJump()
{
    bool canJump = charController.isGrounded;

    //Button Pressed start jumpDuration
    if (joybutton.Pressed && canJump)
    {
        isJumping = true;
        jumpDuration = jumpTime;
    }


    if (isJumping == true)
    {
        if (jumpDuration > 0)
        {
            vertical_Velocity = jump_Force;
            jumpDuration -= Time.deltaTime;
        }

    //timer runs out
        else
        {
           isJumping = false;
        }
    }

    //cancel jump if mid-air
    if (!joybutton.Pressed)
    {
        isJumping = false;
    }
}

I have no way of stopping the player from jumping as soon as they land with the GUI touchButton. I get desired results with keyboard and gamepad buttons.


Solution

  • Add a variable to remember the state of the button last frame. That way, you can enter the jump start block only if it's the first frame of the button being hit:

    private bool wasJumpPressedLastFrame = false;
    
    void PlayerJump()
    {
        bool canJump = charController.isGrounded;
    
        //Button Pressed start jumpDuration
        if (joybutton.Pressed && canJump && !wasJumpPressedLastFrame )
        {
            isJumping = true;
            jumpDuration = jumpTime;
        }
    
    
        if (isJumping == true)
        {
            if (jumpDuration > 0)
            {
                vertical_Velocity = jump_Force;
                jumpDuration -= Time.deltaTime;
            }
    
        //timer runs out
            else
            {
               isJumping = false;
            }
        }
    
        //cancel jump if mid-air
        if (!joybutton.Pressed)
        {
            isJumping = false;
        }
    
        wasJumpPressedLastFrame = joyButton.Pressed;
    }