Godotのリストに戻る

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

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

概要

GodotのProcess Modeは、get_tree().paused = true時の各ノードの動作を制御する機能です。NPCとの会話中は背景を止めつつ、ダイアログだけは操作可能にするといった制御が可能になります。

実際のゲーム開発で、この機能を知らなかった時は、各オブジェクトに個別にフラグを立てて制御していて、コードが複雑になってしまった経験があります。Process Modeを使うことで、シンプルにポーズ機能を実装できるようになりました。

Process Mode設定画面

Process Modeの種類

1. Pausable (停止可能) - デフォルト

  • ポーズ時に_process_physics_processが停止
  • プレイヤー、敵、ゲーム世界のオブジェクトに適用

2. Always (常に実行)

  • ポーズ状態を無視して常に動作
  • 会話中のNPC、UI、BGMなどに使用

3. When Paused (ポーズ中のみ実行)

  • ポーズ中だけ動作
  • ポーズメニュー、「PAUSE」表示などに使用

実装例:ダイアログ表示中のポーズ制御

初めてNPCとの会話システムを作った時、「会話中にプレイヤーが動いてしまう!」という問題に直面しました。最初は会話中フラグで制御しようとしましたが、Process Modeを使えば一行でゲーム全体を止められることに気づいた時は感動しました。

ダイアログ表示中のゲーム画面
# NPC.gd
# インスペクターでProcess Modeを "Always" に設定

func _process(delta):
    if Input.is_action_just_pressed("interact") and can_talk:
        if is_dialog_active():
            # ダイアログを閉じてポーズ解除
            close_dialog()
            get_tree().paused = false
        else:
            # ダイアログを開いてゲームをポーズ
            open_dialog()
            get_tree().paused = true

よくある使用例

ポーズメニューの実装

# PauseMenu.gd (Process Mode: When Paused)
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

BGMコントローラー

# BGMController.gd (Process Mode: Always)
extends AudioStreamPlayer

func _ready():
    process_mode = Node.PROCESS_MODE_ALWAYS
    # ポーズ中もBGMは再生し続ける

設定方法

  1. インスペクター: ノードを選択 → Node → Process → Mode
  2. コード: process_modeプロパティを使用
    func _ready():
        process_mode = Node.PROCESS_MODE_ALWAYS
    

注意点

  • 子ノードは親ノードのProcess Modeを継承する
  • UIノード全体を「Always」に設定すれば、子要素も自動的にポーズ中も動作する
  • ポーズ中の入力処理には注意(意図しない操作を防ぐ)

実装して学んだこと

Process Modeを使いこなせるようになって、ゲームの一時停止機能がとても簡単に実装できるようになりました。特に、会話システムやメニュー画面の実装で重宝しています。最初は「どのノードをAlwaysにすべきか」で迷いましたが、基本的にUIとBGM関連のノードをAlwaysにするという原則を決めてからは、スムーズに実装できるようになりました。