ゲームの一時停止

一時停止?

ほとんどのゲームでは、ある時点でゲームを中断して、休憩やオプションの変更など、他の何かを行うことが望ましいです。 しかし、これは見かけほど簡単ではありません。 ゲームは停止する場合がありますが、一部のメニューとアニメーションは引き続き動作することが望ましい場合があります。

一時停止できるもの(およびできないもの)をきめ細かく制御することは多くの作業であるため、一時停止のためのシンプルなフレームワークが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;
}

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