Pausing games

    Implementing a fine-grained control for what can be paused (and what can not) is a lot of work, so a simple framework for pausing is provided in Godot.

    To set pause mode, the pause state must be set. This is done by assigning to the property:

    GDScript

    C#

    1. GetTree().Paused = true;

    Doing so will have the following behavior:

    • _process and _physics_process will not be called anymore in nodes.
    • and _input_event will not be called anymore either.

    This effectively stops the whole game. Calling this function from a script, by default, will result in an unrecoverable state (nothing will work anymore!).

    You can achieve the same result in code:

    GDScript

    By default all nodes have this property in the “Inherit” state. This means, that they will only process (or not) depending on what this same property is set on the parent node. If the parent is set to “Inherit” , then the grandparent will be checked and so on. Ultimately, if a state can’t be found in any of the grandparents, the pause state in SceneTree is used. This means that, by default, when the game is paused every node will be paused.

    So the three possible states for a node are:

    • Inherit: Process depending on the state of the parent, grandparent, etc. The first parent that has a non-Inherit state.
    • Stop: Stop the node no matter what (and children in Inherit mode). When paused this node will not process.
    • Process: Process the node no matter what (and children in Inherit mode). Paused or not this node will process.

    An example of this is creating a popup or panel with controls inside, and set its pause mode to “Process” then hide it:

    Just by setting the root of the pause popup to “Process”, all children and grandchildren will inherit that state. This way, this branch of the scene tree will continue working when paused.

    Finally, make it so when a pause button is pressed (any button will do), enable the pause and show the pause screen.

    GDScript

    C#

    1. get_tree().paused = true

    To remove the pause, do the opposite when the pause screen is closed:

    GDScript

    1. func _on_pause_popup_close_pressed():
    2. $pause_popup.hide()
    3. get_tree().paused = false

    And that should be all!