🎬
[Godot Engine 3.x] ポーズモードをカスタマイズする
Godot Engineではポーズ機能があり、非常に便利で強力です。
get_tree().paused = true
上記の1行でpause_mode
がPAUSE_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以降にはバックポートされて個別のポーズが実装されるかもしれません。
現在レビュー中とのことですが、ひとまずは本記事の実装で出来そうなので、個人的にはこれで十分かな…と思ってます。
Discussion