ゲームの一時停止

一時停止?

In most games it is desirable to, at some point, interrupt the game to do something else, such as taking a break or changing options. However, this is not as simple as it seems. The game might be stopped, but it might be desirable that some menus and animations continue working.

一時停止できるもの(およびできないもの)をきめ細かく制御することは多くの作業であるため、一時停止のためのシンプルなフレームワークがGodotで提供されています。

一時停止の仕組み

一時停止モードにするには、一時停止状態を設定する必要があります。これは SceneTree.paused プロパティに true を割り当てることで行われます:

get_tree().paused = true
GetTree().Paused = true;

これを行うと、次の動作が発生します:

  • 2Dおよび3Dの物理演算が停止します。
  • _process_physics_process はノードでもう呼び出されません。
  • _input_input_event ももう呼び出されません。

これは効果的にゲーム全体を停止します。スクリプトからこの関数を呼び出すと、デフォルトでは、回復不能な状態になります(もう何も動作しません!)。

ホワイトリストノード

一時停止を有効にする前に、一時停止中も機能し続ける必要があるノードがホワイトリストに登録されていることを確認してください。これを行うには、ノードの "Pause Mode" プロパティを編集します:

../../_images/pausemode.png

コードで同じ結果を得ることができます:

func _ready():
    pause_mode = Node.PAUSE_MODE_PROCESS

デフォルトでは、すべてのノードに "Inherit(継承)" 状態のこのプロパティがあります。つまり、親ノードに設定されている同じプロパティに応じて処理する (または処理しない) ことを意味します。親が "Inherit" に設定されている場合、祖父母がチェックされます。最終的に、いずれかの祖先に状態が見つからない場合、SceneTreeの一時停止状態が使用されます。これは、デフォルトでは、ゲームが一時停止すると、すべてのノードが一時停止することを意味します。

したがって、ノードの3つの可能な状態は次のとおりです:

  • Inherit(継承): 親、祖父母などの状態に応じたプロセス。最初の親は非継承状態を持っている。
  • Stop(停止): 無条件にノードを停止します(Inherit モードの子も)。一時停止すると、このノードはもう処理されません。
  • Process(処理): 無条件にノードを処理します(Inherit モードのも)。このノードは一時停止中か否かを問わず処理されます。

この例は、内部にコントロールを持つポップアップまたはパネルを作成し、一時停止モードを "Process" に設定してから非表示にします:

../../_images/pause_popup.png

一時停止ポップアップのルートを "Process" に設定するだけで、すべての子と孫がその状態を継承します。この場合、シーンツリーのこのブランチは、一時停止しても機能し続けます。

最後に、一時停止ボタンが押されたとき(どのボタンでも実行可能)、一時停止を有効にして一時停止画面を表示するようにします。

func _on_pause_button_pressed():
    get_tree().paused = true
    $pause_popup.show()
public void _on_pause_button_pressed()
{
    GetTree().Paused = true;
    GetNode<Control>("pause_popup").Show();
}

一時停止を解除するには、一時停止画面が閉じているときに反対の操作を行います:

func _on_pause_popup_close_pressed():
    $pause_popup.hide()
    get_tree().paused = false
public void _on_pause_popup_close_pressed()
{
    GetNode<Control>("pause_popup").Hide();
    GetTree().Paused = false;
}

そして、これですべてです!