【Godot4.x】OKダイアログ / YES・NOダイアログの使い方

今回は Godot標準ノードに含まれている OK ダイアログと YES・NOダイアログの使い方を解説します。

OKダイアログ (AcceptDialogノード) の使い方

Godot Engine では "AcceptDialog" ノードで OKダイアログを表示できます。

AcceptDialogノードについて

まずは AcceptDialog ノードを追加します。

追加できたらインスペクタからパラメータを指定します。

項目名 説明 デフォルト値
Accept Dialog > OK OKボタンテキスト "OK"
Accept Dialog > Dialog > Text ダイアログ本文 空欄
Accept Dialog > Dialog > Hide on OK OKボタンを押したら
ダイアログが消えるかどうか
有効
Accept Dialog > Dialog > Close on Escape Escapeキーで
ダイアログを閉じるかどうか
有効
Accept Dialog > Dialog > Autoharp 本文を自動改行するかどうか オフ
Window > Titile ウィンドウのタイトル文字 "Alert!"

 

なおダイアログのフォントを変えたい場合は、Themeからフォントを指定します。

次にスクリプトをアタッチして以下のように記述します。

extends Node2D

## OKダイアログ
@onready var _ok_dialog = $AcceptDialog

func _ready() -> void:
    # OKダイアログを中央に表示.
    _ok_dialog.popup_centered()

実行すると以下のようにダイアログが表示されます(フォントは日本語フォントに変更しています)。

なおダイアログが表示されているときには、閉じるボタンではアプリケーションを終了することができません。ダイアログの "OK"ボタンをクリックするか、Escapeボタンで ダイアログを閉じる必要があります。

閉じるタイミングを取得する

ダイアログを閉じたタイミングを取得するには、confirmedシグナル または canceledシグナルを使用します。

  • canceled(): Escapeボタンで閉じた場合
  • confirmed(): OKボタンを押して閉じた場合

シグナルを使わずに閉じた判定をする

シグナルを使わずに閉じた判定をする場合には has_focus() で判定できます。has_focus() が false であればフォーカスがない状態(閉じた)と判定できます。

extends Node2D

## 状態.
enum eState {
    MAIN,
    DIALOG, # ダイアログが開いている.
}

## OKダイアログ
@onready var _ok_dialog = $AcceptDialog

## 状態.
var _state = eState.MAIN

func _ready() -> void:
    # OKダイアログを中央に表示.
    _ok_dialog.popup_centered()
    _state = eState.DIALOG # ダイアログ開いた状態.

func _process(delta: float) -> void:
    match _state:
        eState.MAIN:
            pass
        eState.DIALOG:
            if _ok_dialog.has_focus() == false:
                # ダイアログが閉じられた.
                print("OKダイアログが閉じた")
                _state = eState.MAIN

Yes・Noダイアログの使い方

Yes・Noダイアログは "ConfirmationDialog" ノードを使用することで実装できます。

ConfirmationDialogノードの使い方

ConfirmationDialogノードのインスペクタは "Cancel Button Text" というキャンセルボタンのテキスト項目が追加されただけで、OKダイアログとほぼ同じです。

スクリプトからの呼び出し方法もほぼ同じです。

extends Node2D

## Yes/Noダイアログ.
@onready var _yes_no_dialog = $ConfirmationDialog

func _ready() -> void:
    # 画面中央に表示
    _yes_no_dialog.popup_centered()

繰り返しになりますが、ダイアログを閉じないとウィンドウが閉じれないので注意です。

シグナルで入力結果を受け取る

シグナルは全く同じです。

ただし、cancelシグナルは、Escapeキーによるキャンセルと「キャンセル」ボタンをクリックしたときにも発生します。

それと OKボタン と CANCELボタンのどちらを押されたかを判定する方法ですが、現状だとシグナルを使うしか判定はできなさそうでした。

完成プロジェクト

今回作成したプロジェクトを添付しておきます。

参考