Godot和訳速報「ゲームのポーズ」

ゲームのポーズ

ポーズとは

ゲームは途中で休憩を挟んだり、オプションを変更したり出来るようにしておく必要があります。これはほとんどのゲームにおいて言えることで、ゲームの中断機能を実装する必要があります。実はこれはそんなに簡単な機能ではありません。ゲームが中断された場合、メニューやアニメーションはその時点から再開できなければいけません。

ポーズ出来るもの、出来ないものをいちいち制御するというのは、なかなか骨が折れます。なので、Godotはポーズの実装を簡単にするフレームワークが用意されています。

ポーズなどんなものか

Godotではポーズステートを設定してポーズモードに移行します。SceneTree.set_pause()を引数Trueを指定して実行することで設定できます。

get_tree().set_pause(true)

ポーズモードに移行すると、次のような状態になります。

  • 2D、3Dに関係なく、物理エンジンの行う物理演算は停止します。

  • _processと_fixed_processはそのノードでは呼ばれなくなります。

  • _inputや_input_eventも呼ばれなくなります。

この関数を使えば効果的にゲームのポーズを実装出来ます。スクリプトからこの関数を呼び出すと、デフォルトでは、オブジェクトが検出していた判定が全て無効になります。全ての動作が停止すると言うことです。

ノードのホワイトリスト

ポーズ中にでも動作させたいノードはホワイトリストに登録してください。ノードの”Pause Mode”プロパティを編集します。

画像

デフォルトではこのプロパティは全て”Inherit”(継承)ステートに設定されています。親ノードのステートがチェックされ、それに従うと言う意味です。親にも”Inherit”ステートが設定されている場合は、その祖先がチェックされます。全てのノードに”inherit”ステートが設定されていた場合は、全てのノードの祖先にあたるSceneTreeのプロパティが参照され、ポーズ時に全てのノードが停止することになります。

このプロパティが取りうるステートは全部で3つです。

  • Inherit:Inheritが設定されていない最初の祖先の状態を参照し従います。

  • Stop:ポーズ時にノードを停止します。

  • Process:ポーズ時もノードが動くようにします。

例を挙げてみましょう。なんらかのコントロールオブジェクトを持つパネルか、ポップアップを作成します。ポーズモードを”Process”に設定し、ポーズ中だけ表示するように設定します。

画像

ポーズ用のポップアップのルートノードのポーズプロパティを”Process”に設定するだけで、そのノード以下の子ノードには全て”Process”継承されます。

ポーズボタンを押された時、ポーズが実行されるように動作を書きます。

func _on_pause_button_pressed():
    get_tree().set_pause(true)
    get_node("pause_popup").show()

一時停止を解除する時は逆の操作を行うようにします。

func _on_pause_popup_close_pressed():
    get_node("pause_popup").hide()
    get_tree().set_pause(false)

これでポーズは実装できました。

Add a Comment

メールアドレスの入力は任意です。(公開されることはありません)