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

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

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

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

AcceptDialogノードについて

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

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

項目名説明デフォルト値
Accept Dialog > OKOKボタンテキスト“OK”
Accept Dialog > Dialog > Textダイアログ本文空欄
Accept Dialog > Dialog > Hide on OKOKボタンを押したら
ダイアログが消えるかどうか
有効
Accept Dialog > Dialog > Close on EscapeEscapeキーで
ダイアログを閉じるかどうか
有効
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ボタンのどちらを押されたかを判定する方法ですが、現状だとシグナルを使うしか判定はできなさそうでした。

完成プロジェクト

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

参考