無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、ダイアログの基礎となるクラス AcceptDialog に、 Container の派生クラスを使って SpinBox や Label を縦や横に並べて配置したダイアログに Cancel ボタンを追加した状態で、ダイアログのサイズをフィットさせて表示するスクリプト例と実行結果を紹介します。
例として、以前に追加した独自のツールメニューを選択した際に、ダイアログを表示させます。

※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。
前回の記事
ダイアログの基礎となるクラス AcceptDialog でシーンを作成してContainer の派生クラスを使って縦や横に並べて、スペース(マージン)を追加しながら、各コントロールを配置する例を紹介しました。
ツールメニューを追加して、任意の関数を呼び出すスクリプト例
ダイアログを表示するきっかけとして用いるツールメニューの追加方法については以下の記事を参照して下さい。
ツールメニュー選択時にダイアログを表示するスクリプト例
ツールメニュー選択時にダイアログを表示するスクリプト例です。
※説明は、スクリプト内のコメントを参照してください。
_enter_tree イベント関数で追加したツールメニューが選択されると、_on_menu_item_sc_fit_font_size メンバ関数が呼ばれ、そこでダイアログを作成して、ボタンが押されたときに呼び出す関数の関連付けをして、表示します。
Cancel ボタンも add_cancel_button メンバ関数を呼び出して追加しました。
ダイアログをメンバ変数にすることで、複数の関数の間で、ダイアログを参照し、 OK ボタンが押されたときにダイアログの入力された値を確認することもできました。
処理が終わったら、ダイアログは queue_free メンバ関数で解放します。
@tool
extends EditorPlugin
## 選択されているノード群にテキストを持ったコントロールがある場合に、
## コントロールのサイズからはみ出ない最大のサイズにフィットしたフォントサイズに自動調節するエディタ拡張です。
## メニュー「プロジェクト」→「ツール」に追加されたメニューアイテムを選択することで実行されます。
## メニューアイテムの表示名です。
const tool_menu_item_name: StringName = "Sc Fit Font Size"
## パラメータを入力するダイアログのシーンです。
const sc_fit_font_size_dialog_scene: PackedScene = preload("res://addons/sc_fit_font_size/sc_fit_font_size_dialog.tscn")
## sc_fit_font_size_dialog_scene シーンを実体化したダイアログです。
var sc_fit_font_size_dialog: AcceptDialog = null
## プラグインの初期化処理を定義します。
## プラグイン (プロジェクト設定ダイアログ>プラグイン>有効) を有効にした直後や、プラグインが有効な状態のプロジェクトを開いた際に呼び出されます。
func _enter_tree():
# Initialization of the plugin goes here.
# メニュー「プロジェクト」→「ツール」にサブメニューを追加します。メニュー選択時に、第二引数のメンバ関数を呼び出します。
add_tool_menu_item(tool_menu_item_name, Callable(self, "_on_menu_item_sc_fit_font_size"))
# ダイアログはツールメニューが実行されるまで無効です。
sc_fit_font_size_dialog = null
print("sc_fit_font_size.gd: _enter_tree called")
## プラグインの後片付けの処理を定義します。
## プラグインを無効 (プロジェクト設定ダイアログ>プラグイン>有効) にした直後や、プラグインが有効な状態のプロジェクトを閉じた際に呼び出されます。
func _exit_tree():
# Clean-up of the plugin goes here.
remove_tool_menu_item(tool_menu_item_name)
_free_dialog() # もしも解放されていなければ、ダイアログを解放します。
print("sc_fit_font_size.gd: _exit_tree called")
## メニュー「プロジェクト」→「ツール」→「Sc Fit Font Size」メニューが選択された際に呼び出される関数です。
## 選択中のノード群またはその下位のノード群の Control 派生クラスの
## 表示テキストがコントロールのサイズに合わさるようにフォントサイズを調整します。
func _on_menu_item_sc_fit_font_size():
_free_dialog() # もしも解放されていなければ、ダイアログを解放します。
# ダイアログのシーンを実体化します。
sc_fit_font_size_dialog = sc_fit_font_size_dialog_scene.instantiate()
# ダイアログに Cancel ボタンを追加します。
sc_fit_font_size_dialog.add_cancel_button("Cancel")
# ダイアログに配置されているコントロール群にフィットするようにサイズを調整するために 0 を設定します。
# これにより、最小限の Window のサイズが自動的に設定されます。インスペクターでも同様の方法を実行できます。
sc_fit_font_size_dialog.size = Vector2(0, 0)
# ダイアログの OK ボタン、 Cancel ボタンと関数を関連付けます。
sc_fit_font_size_dialog.connect("confirmed", Callable(self, "_on_dialog_confirmed"))
sc_fit_font_size_dialog.connect("canceled", Callable(self, "_on_dialog_canceled"))
get_tree().root.add_child(sc_fit_font_size_dialog)
## パラメータを入力するダイアログを表示します。
sc_fit_font_size_dialog.popup_centered()
return
## ダイアログで OK ボタンが押された際に呼び出される関数です。
func _on_dialog_confirmed():
print("_on_dialog_confirmed called.")
print_dialog_parameter() # ダイアログの SpinBoxMin, SpinBoxMax の値を出力します。
_free_dialog() # ダイアログを解放します。
return
## ダイアログで Cancel ボタンが押された際に呼び出される関数です。
func _on_dialog_canceled():
print("_on_dialog_canceled called.")
print_dialog_parameter() # ダイアログの SpinBoxMin, SpinBoxMax の値を出力します。
_free_dialog() # ダイアログを解放します。
return
## ダイアログを解放して [member sc_fit_font_size_dialog] を null に設定します。
## [member sc_fit_font_size_dialog] の使用が完了した際に呼び出します。
func _free_dialog():
# ダイアログがもしも消されていない場合は解放します。
if sc_fit_font_size_dialog != null:
sc_fit_font_size_dialog.queue_free()
sc_fit_font_size_dialog = null
return
## デバッグ用。 [member sc_fit_font_size_dialog] の2個 SpinBox の値を print 関数で出力します。
func print_dialog_parameter() -> void:
# ダイアログがない場合はエラーメッセージを出力して戻ります。
if sc_fit_font_size_dialog == null:
push_error("sc_fit_font_size.gd: sc_fit_font_size_dialog == null")
return
# ダイアログに配置されている SpinBox コントロールを取得します。
var spin_box_min: SpinBox = sc_fit_font_size_dialog.find_child("SpinBoxMin")
var spin_box_max: SpinBox = sc_fit_font_size_dialog.find_child("SpinBoxMax")
# SpinBox が見つからない場合はエラーメッセージを出力して戻ります。
if spin_box_min == null or spin_box_max == null:
push_error("sc_fit_font_size.gd: spin_box_min == null or spin_box_max == null")
return
# SpinBox の値を出力ボトムパネルに表示します。
print("SpinBoxMin.value = " + str(spin_box_min.value) + ", SpinBoxMax.value = " + str(spin_box_max.value))
return
ダイアログのサイズを内容に応じてフィットさせる
以下のコードを実行することで、 Window のサイズは、ボタンなどのコントロール群を表示する最小限の値に自動的に調整されました。
※ sc_fit_font_size_dialog 変数のクラスは AcceptDialog です。
sc_fit_font_size_dialog.size = Vector2(0, 0)
インスペクタードックでも、同様に最小限の値に調整することができます。

AcceptDialog クラスのノードを選択して、インスペクタードックの Window クラスの Size プロパティで 0 を設定すると、最小のサイズ(例では 200 px )が自動的に割り当てられて、余分な横幅がスリムになりました。

テスト
ツールメニューを選択して、そのメニューに割り当てた、ダイアログを表示する関数を呼び出します。
エディターの 2D ワークスペースでは、右側に余白のあったダイアログも、実際に表示する際はフィットしたサイズになっていました。

OK ボタン、 Cancel ボタンが押されるとそれぞれ設定した関数が呼び出されました。
その後、ダイアログで入力した数値を取得することも出力ボトムパネルで確認できました。


以下は、テスト結果の動画です。
まとめ
今回は、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、ダイアログの基礎となるクラス AcceptDialog に、 Container の派生クラスを使って SpinBox や Label を縦や横に並べて配置したダイアログに Cancel ボタンを追加した状態で、ダイアログのサイズをフィットさせて表示するスクリプト例と実行結果を紹介しました。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- Control — Godot Engine (4.x)の日本語のドキュメント
- AcceptDialog — Godot Engine (4.x)の日本語のドキュメント
- SpinBox — Godot Engine (4.x)の日本語のドキュメント
- AcceptDialog — Godot Engine (4.x)の日本語のドキュメント #add_cancel_button
記事一覧 → Compota-Soft-Press
コメント