Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Pausando jogos e modo de processo

Introdução

Na maioria dos jogos é desejável, em algum momento, interromper o jogo para fazer algo mais, como fazer uma pausa ou mudar as opções. Implementar um controle refinado para o que pode ser pausado (e o que não pode) é muito trabalhoso, portanto, uma estrutura simples para pausar é fornecida no Godot.

Como a pausa funciona

Para pausar o jogo, o estado de pausa deve ser definido. Isto é feito atribuindo true à propriedade SceneTree.paused:

get_tree().paused = true

Doing this will cause two things. First, 2D and 3D physics will be stopped for all nodes. Second, the behavior of certain nodes will stop or start depending on their process mode.

Nota

The physics servers can be made active while the game is paused by using their set_active methods.

Modos de processo

Each node in Godot has a "Process Mode" that defines when it processes. It can be found and changed under a node's Node properties in the inspector.

../../_images/pausemode.webp

Você também pode alterar a propriedade com o código:

func _ready():
    process_mode = Node.PROCESS_MODE_PAUSABLE

This is what each mode tells a node to do:

  • Inherit: Process depending on the state of the parent, grandparent, etc. The first parent that has a non-Inherit state.

  • Pausable: Process the node (and its children in Inherit mode) only when the game is not paused.

  • WhenPaused: Process the node (and its children in Inherit mode) only when the game is paused.

  • Always: Process the node (and its children in Inherit mode) no matter what. Paused or not, this node will process.

  • Disabled: The node (and its children in Inherit mode) will not process at all.

Por padrão, todos os nós têm esta propriedade no estado "Herdar". Se o pai estiver configurado para "Herdar", então o avô será verificado e assim por diante. Se um estado não puder ser encontrado em nenhum dos avós, o estado de pausa no SceneTree é usado. Isto significa que, por padrão, quando o jogo for pausado, todos os nós serão pausados. Várias coisas acontecem quando um nó pára de processar.

The _process, _physics_process, _input, and _input_event functions will not be called. However signals still work and cause their connected function to run, even if that function's script is attached to a node that is not currently being processed.

Animation nodes will pause their current animation, audio nodes will pause their current audio stream, and particles will pause. These resume automatically when the game is no longer paused.

It is important to note that even if a node is processing while the game is paused physics will NOT work for it by default. As stated earlier this is because the physics servers are turned off. The physics servers can be made active while the game is paused by using their set_active methods.

Pause menu example

Start by creating a button that will be used to pause the game.

Create a menu containing a close button, set the Process Mode of the menu's root node to When Paused, then hide the menu. Since the process mode is set to When Paused on the root node, all its children and grandchildren will inherit that process mode. This way, all the nodes in the menu will start processing when the game is paused.

Attach a script to the menu's root node, connect the pause button created earlier to a new method in the script, and inside that method pause the game and show the pause menu.

func _on_pause_button_pressed():
    get_tree().paused = true
    show()

Finally, connect the menu's close button to a new method in the script. Inside that method, unpause the game and hide the pause menu.

func _on_close_button_pressed():
    hide()
    get_tree().paused = false

You should now have a working pause menu.