Godot4 ダイアログの最小サイズでの表示とボタンと関数の関連付けの実装例

無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、ダイアログの基礎となるクラス AcceptDialog に、 Container の派生クラスを使って SpinBoxLabel 縦や横に並べて配置したダイアログ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)

インスペクタードックでも、同様に最小限の値に調整することができます。

Godot4 AcceptDialog のサイズが余分に大きくなった後にフィットさせる手順1

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

Godot4 AcceptDialog のサイズが余分に大きくなった後にフィットさせる手順2

テスト

ツールメニューを選択して、そのメニューに割り当てた、ダイアログを表示する関数を呼び出します。

エディターの 2D ワークスペースでは、右側に余白のあったダイアログも、実際に表示する際はフィットしたサイズになっていました。

Godot4 カスタマイズした AcceptDialog をサイズをフィットさせて Cancel を追加して表示してボタンを押して関数を呼ぶ例1

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

Godot4 カスタマイズした AcceptDialog をサイズをフィットさせて Cancel を追加して表示してボタンを押して関数を呼ぶ例2
Godot4 カスタマイズした AcceptDialog をサイズをフィットさせて Cancel を追加して表示してボタンを押して関数を呼ぶ例3

以下は、テスト結果の動画です。

まとめ

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

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました