user5677145
user5677145

Reputation:

Pause don't works (Unity c#)

I writing runner game on Unity (C#) for mobile phones.

I made Pause button on screen, using Canvas - Button.

Also I made code for Pause in Platformer2DUserControl script.

Here it is code of this script:

   using UnityEngine;
using UnitySampleAssets.CrossPlatformInput;

namespace UnitySampleAssets._2D
{

    [RequireComponent(typeof(PlatformerCharacter2D))]
    public class Platformer2DUserControl : MonoBehaviour
    {
        private PlatformerCharacter2D character;
        private bool jump;
        public bool paused;

        private void Awake()
        {
            character = GetComponent<PlatformerCharacter2D>();
            paused = false;
        }

        private void Update()
        {

            /*if (Input.GetButton("Fire1"))
            {

            }*/


            if (!jump)
                // Read the jump input in Update so button presses aren't missed.
                 jump = Input.GetButton("Fire1"); //&& CrossPlatformInputManager.GetButtonDown("Jump"); 


        }

        private void FixedUpdate()
        {
            // Read the inputs.
            bool crouch = Input.GetKey(KeyCode.LeftControl);
            // float h = CrossPlatformInputManager.GetAxis("Horizontal");
            // Pass all parameters to the character control script.
            character.Move(1, false, jump);
            jump = false;

        }
        public void Pause()

        {
            if (!jump)
                // Read the jump input in Update so button presses aren't missed.
                jump = Input.GetButton("Fire1"); //&& CrossPlatformInputManager.GetButtonDown("Jump");

            paused = !paused;


            if (paused)
            {
                jump = !jump;
                Time.timeScale = 0;

            }
            else if (!paused)
            {
               // jump = Input.GetButton("Fire1");
                Time.timeScale = 1;
            }
        }
    }
}

My Pause Button is WORKS well. But when I tap it , my character is jumping and game is pausing.

I want to make that , when I tapping the button game just pausing and character don't jump.

How I can make it. Thank's for help.

Upvotes: 2

Views: 1674

Answers (4)

DroneLord
DroneLord

Reputation: 63

I have always done it like this, essentially surround the entire fixed update (or wherever you have your game motion) with the paused-bool

    private void FixedUpdate()
    {
if (paused != true){
        // Read the inputs.
        bool crouch = Input.GetKey(KeyCode.LeftControl);
        // float h = CrossPlatformInputManager.GetAxis("Horizontal");
        // Pass all parameters to the character control script.
        character.Move(1, false, jump);
        jump = false;
}
    }

Upvotes: 0

Parth Patel
Parth Patel

Reputation: 1

One solution would be possible make sure the raycast on of pause button.

Upvotes: 0

Aayush Sabharwal
Aayush Sabharwal

Reputation: 11

I would advise you not to use the same input for jumping and pausing. Also, separate your jump and pause functionalities into separate functions. For pausing, create a UI button on the screen and make it call a public function on a Pause script, that will toggle pause. Then, in the same function, check if you are paused or not and adjust Time.timescale accordingly

You will have to attach the script with pause functionality on to an object that will always be in a screen (Say, a panel in your canvas or your MainCamera). Under the button, add a new onClick() function after dragging the GO with the apt script to the box. Then, select the public function aforementioned.

private bool paused = false;

//The function called by the button OnClick()
public void TogglePause()
{
    paused = !paused;

    if(paused)
        Time.timescale = 0f;
    else
        Time.timescale = 1f;
}

Hope this helped!

Upvotes: 1

JoRouss
JoRouss

Reputation: 2884

Well, your code is messed up, but just remove the jump script from the pause method. So it will just pause...

public void Pause()

    {
        paused = !paused;

        if (paused)
        {
            Time.timeScale = 0;
        }
        else
        {
           Time.timeScale = 1;
        }
    }

Note that Input.GetButton should only be called in Update

EDIT

The problem that you have to tap your screen to press the button. And the code jump = Input.GetButton("Fire1"); basically means "Am I tapping the screen?" So both JUMP and PAUSE are triggered.

One solution would be to put a canvas filling the whole screen under your buttons. You will trigger a JUMP action only when this canvas is clicked. So when you click your pause button, it will stop the propagation and won't click the full screen canvas, which won't trigger the jump action.

EDIT2

Try changing the lines (in the Update function) :

if (!jump)
            // Read the jump input in Update so button presses aren't missed.
             jump = Input.GetButton("Fire1");

for :

if (!jump && !paused)
                // Read the jump input in Update so button presses aren't missed.
                 jump = Input.GetButton("Fire1");

I think the button event is called before the Update, see reference

Upvotes: 0

Related Questions