[Godot Engine 3.x] ポーズモードをカスタマイズする

5544 ワード

Godot Engineではポーズ機能があり、非常に便利で強力です。

get_tree().paused = true

上記の1行でpause_modePAUSE_MODE_STOPが設定されているノードと、
その子ノードとしてPAUSE_MODE_INHERITが設定されたはノードはすべてのプロセスが停止します。

しかし、Godot Engine 3.x ではget_tree()はルートのゲームツリーが取得され、ポーズはルートから停止が開始されます。
つまり、個別のノードツリーに対して停止したい場合は少し工夫が必要になります。

シーンの構成


例えば、コントローラーノードの下にGame、GUIというそれぞれのレイヤーを用意した場合、
Gameレイヤーは止めたいGUIは動かしておきたい(またはその逆)という場面が多々あると思います。

Main.gd
onready var _game_layer:CanvasLayer = get_node("Game")
onready var _gui_layer:CanvasLayer = get_node("GUI")

func _ready():
	self.pause_mode = Node.PAUSE_MODE_PROCESS
	get_tree().paused = true # 基本的にポーズにしておく
	
	pause(_game_layer, false)
	pause(_gui_layer, true)

func pause(_node:Node, _enable:bool = false):
	if _enable:
		_node.pause_mode = Node.PAUSE_MODE_STOP
	else:
		_node.pause_mode = PAUSE_MODE_PROCESS

まずは、基本的にゲーム全体はポーズ状態にしておきます。
その上で、特定のノードを ポーズ状態の中に入れるか外すか を動的に変える実装をします。

指定するポーズモードに「継承(PAUSE_MODE_INHERIT)」にする処理がないので、必要ならカスタマイズしましょう。

今回だと基本的に2つのノードに対して、ポーズの状態に入れるか外すかを考えているので、それぞれのツリー内にあるノードはすべてPAUSE_MODE_INHERITになっています。

Godot Engine 4.0からはノード単位でのポーズ実装がされる?

3.5以降にはバックポートされて個別のポーズが実装されるかもしれません。
現在レビュー中とのことですが、ひとまずは本記事の実装で出来そうなので、個人的にはこれで十分かな…と思ってます。