Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

暂停游戏与处理模式

介绍

在大多数游戏中,或多或少都会希望能够中断游戏去干些别的,例如休息一下或者修改选项。要非常细致地控制哪些可以暂停(哪些不可以)实现起来非常麻烦,所以 Godot 提供了一个简单的暂停框架。

如何暂停工作

要将游戏暂停,就必须设置暂停状态。将 SceneTree.paused 属性赋值为 true 即可:

get_tree().paused = true

这样做会导致两件事。首先,所有节点的 2D 和 3D 物理都会停止。其次,根据处理模式的不同,某些节点的行为会停止或者开始。

备注

游戏暂停时,可以通过 set_active 方法激活物理服务器。

处理模式

Godot 中的每个节点都有一个‘处理模式(Process Mode)’,它决定了节点在什么时候进行逻辑处理。你可以在检查器(Inspector)里,找到并修改某个节点的 Node (节点)属性来更改这个设置。

../../_images/pausemode.webp

你也可以通过代码来修改该属性:

func _ready():
    process_mode = Node.PROCESS_MODE_PAUSABLE

各个模式对节点的要求是这样的:

  • Inherit(继承) :处理与否取决于父、祖父等等节点中第一个具有非 Inherit 状态的节点。

  • 可暂停(Pausable):只有当游戏没有暂停时,才会处理该节点(以及在继承模式下的子节点)。

  • WhenPaused在游戏暂停时处理节点(及处于 Inherit 模式下的子节点)。

  • 始终(Always):无论如何都会处理该节点(以及在继承模式下的子节点)。无论游戏是否暂停,这个节点都会照常运行。

  • 已禁用(Disabled):该节点(以及在继承模式下的子节点)将完全不会进行任何处理。

默认情况下,所有节点的这个属性都是“Inherit”状态。如果父节点也是“Inherit”,那么就会去检查祖父节点,以此类推。如果祖宗们都没有更改过状态,那么就会使用 SceneTree 的暂停状态。也就是说,在游戏暂停时默认所有节点都会被暂停下来。节点停止处理时会发生不少事情。

_process_physics_process_input_input_event 这些函数将不会被调用。不过,信号(signals)依然可以正常工作,并且会触发它们所连接的函数去执行——哪怕这个函数所在的脚本,是挂在一个当前并没有被处理的节点上的。

动画节点会暂停它们的当前动画,音频节点会暂停它们的当前音频流,粒子也会暂停。游戏不再暂停时,它们都会自动继续运行。

请注意有一点非常重要,即便游戏暂停时节点仍在进行处理,但物理默认是无法正常工作的。如前文所述,这是因为物理服务器会被关闭。游戏暂停时,可以通过 set_active 方法激活物理服务器。

暂停菜单示例

首先创建一个用于暂停游戏的按钮。

创建一个包含‘关闭’按钮的菜单,然后将该菜单根节点的 Process Mode(处理模式) 设置为 When Paused(暂停时) ,接着把这个菜单隐藏起来。由于根节点的处理模式被设为了 When Paused ,它所有的子节点以及更深层的后代节点都会自动继承这个模式。这样一来,当游戏进入暂停状态时,菜单里的所有节点就会立刻开始正常运作(处理逻辑)了。

将一个脚本附加到菜单的根节点,将前面创建的暂停按钮连接到脚本中的一个新方法,在该方法中暂停游戏并显示暂停菜单。

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

最后,将菜单的关闭按钮连接到脚本中的一个新方法。在该方法中,取消游戏暂停并隐藏暂停菜单。

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

现在你应该已经拥有一个可以正常工作的暂停菜单了。