概要
Process Modeは、ノードの処理(_process、_physics_process、_input等)がいつ実行されるかを制御する設定です。ゲームのポーズ機能を実装す る際の中核となる機能です。
Process Modeの種類

Inherit(継承)
親ノードの設定を継承します。ルートノードはPausableとして扱われます。これがデフォルト設定です。
Pausable(停止可能)
get_tree().paused = true
の時に処理が停止します。プレイヤー、敵、ゲーム内オブジェクトなど、ポーズ時に停止すべきノードに使用します。
When Paused(ポーズ中のみ)
ポーズ中だけ処理が実行されます。ポーズメニューや「PAUSED」の表示など、ポーズ中にのみ必要な要素に使用します。
Always(常に実行)
ポーズ状態に関わらず常に処理が実行されます。UI、BGM、ダイアログなど、ポーズ中も動作させたい要素に使用します。
Disabled(無効)
常に処理が停止します。一時的に無効化したいノードに使用します。
設定方法
インスペクターから設定
ノードを選択 → Node → Process → Mode から選択できます。視覚的に確認しながら設定できるため、最も簡単な方法です。
コードから設定
func _ready():
# 定数を使った設定
process_mode = Node.PROCESS_MODE_ALWAYS
process_mode = Node.PROCESS_MODE_WHEN_PAUSED
process_mode = Node.PROCESS_MODE_PAUSABLE
process_mode = Node.PROCESS_MODE_DISABLED
実装例:ダイアログ表示中のポーズ制御
NPCとの会話中、ゲーム世界は停止させつつ、ダイアログは操作可能にする実装例です。

# NPC.gd
extends Area2D
var player_nearby = false
var dialog_active = false
func _ready():
# NPCは常に動作(会話中も反応する必要があるため)
process_mode = Node.PROCESS_MODE_ALWAYS
func _process(delta):
# プレイヤーが近くにいて、対話キーが押された時
if player_nearby and Input.is_action_just_pressed("interact"):
if dialog_active:
# ダイアログを閉じてゲーム再開
close_dialog()
get_tree().paused = false
dialog_active = false
else:
# ダイアログを開いてゲームをポーズ
show_dialog()
get_tree().paused = true
dialog_active = true
func show_dialog():
# ダイアログUIを表示
$DialogBox.visible = true
$DialogBox/Label.text = "こんにちは!いい天気ですね。"
func close_dialog():
$DialogBox.visible = false
ポーズメニューの実装
ESCキーでポーズメニューを表示する一般的な実装例です。
# PauseMenu.gd
extends Control
func _ready():
# ポーズ中のみ動作するように設定
process_mode = Node.PROCESS_MODE_WHEN_PAUSED
visible = false
func _input(event):
if event.is_action_pressed("pause"):
# ポーズ状態を切り替え
visible = !visible
get_tree().paused = visible
if visible:
# ポーズ時:最初のボタンにフォーカス
$VBoxContainer/ResumeButton.grab_focus()
一般的な設定パターン
実際のゲーム開発でよく使われる設定パターンです。
ノードの種類 | Process Mode | 理由 |
---|---|---|
プレイヤー、敵 | Pausable | ポーズ中は動作を停止させる |
ポーズメニュー | When Paused | ポーズ中のみ表示・操作を受け付ける |
UI(HUD、スコア表示) | Always | 常に最新の情報を表示する必要がある |
BGM、環境音 | Always | ポーズ中も音楽は流し続ける |
ダイアログボックス | Always | ポーズ中でも会話を進められるようにする |
エフェクト | Pausable | ポーズ時はアニメーションも停止 |
階層構造での継承
Process Modeは親から子へ継承されます。この仕組みを利用して効率的に設定できます。
Game (Pausable)
├── World (Inherit → Pausable)
│ ├── Player (Inherit → Pausable)
│ └── Enemies (Inherit → Pausable)
├── UI (Always)
│ ├── HUD (Inherit → Always)
│ └── DialogBox (Inherit → Always)
└── PauseMenu (When Paused)
└── Buttons (Inherit → When Paused)
実装のポイント
ゲーム全体のポーズ制御を管理するGameManagerの例です。
# GameManager.gd
extends Node
var is_paused = false
func _ready():
# GameManager自体は常に動作
process_mode = Node.PROCESS_MODE_ALWAYS
func _input(event):
# ダイアログ表示中はポーズメニューを無効化
if $UI/DialogBox.visible:
return
if event.is_action_pressed("pause"):
toggle_pause()
func toggle_pause():
is_paused = !is_paused
get_tree().paused = is_paused
# ポーズメニューの表示切り替え
$PauseMenu.visible = is_paused
# ポーズ時の追加処理
if is_paused:
# 時間計測を停止
$Timer.paused = true
# BGMの音量を下げる
AudioServer.set_bus_volume_db(0, -10)
else:
$Timer.paused = false
AudioServer.set_bus_volume_db(0, 0)
注意点
- 子ノードは親のProcess Modeを継承するため、親ノードの設定を変更すると子も影響を受ける
_input()
や_unhandled_input()
もProcess Modeの影響を受けるget_tree().paused
はSceneTree全体に影響するため、個別制御が必要な場合は独自のフラグ管理も検討する- AnimationPlayerもProcess Modeの影響を受けるため、ポーズ中のアニメーション制御に注意
補足
Process Modeを適切に設定することで、複雑なフラグ管理なしにシンプルなポーズ機能を実装できます。基本的にはゲームオブジェクトをPausable、UIをAlways、ポーズメニューをWhen Pausedに設定するパターンが多く使われます。