Godotのリストに戻る

【Godot】Process Modeによるポーズ機能の制御

作成: 2025-06-20更新: 2025-06-20基礎ブログ記事を読む

概要

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

Process Modeの種類

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に設定するパターンが多く使われます。