Godot4 ラベル等の選択ノードのフォントサイズを一括調整するメニュー実装例

無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、エディター機能を拡張するプラグインを実装する EditorPlugin クラスを用いて追加したツールメニューアイテム実行した際に、その時点で選択しているノード群を自動的に編集するスクリプト例を紹介します。

例として Button または Label クラスなどの Control 派生クラスのノードの、テキストのフォントサイズを自動的に調整します。

※ GodotEngine 4.4 (現状は unstable) からは EditorContextMenuPlugin によって、コンテキストメニューにメニューを追加できそうですが、2025 年 3 月 1 日現在の最新版である 4.3 では実装されていません。

※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。

前回の記事

追加したツールメニューから呼び出される関数で、選択中のノード群(とその下位のノード群)から特定のクラス(例では Control) またはその派生クラスのノードだけ得るスクリプト例については以下の記事を参照してください。

ツールメニューから選択中ノードのフォントサイズを調整

以下は、追加したツールメニューから呼び出された _on_menu_item_sc_fit_font_size 関数が、選択中のノードの Control クラス(派生含む)の該当ノードの持つテキストがコントロールサイズからはみでない最大のフォントサイズ調整するスクリプト例です。

@tool
extends EditorPlugin
## 選択されているノード群にテキストを持ったコントロールがある場合に、
## コントロールのサイズからはみ出ない最大のサイズにフィットしたフォントサイズに自動調節するエディタ拡張です。
## メニュー「プロジェクト」→「ツール」に追加されたメニューアイテムを選択することで実行されます。

## メニューアイテムの表示名です。
var tool_menu_item_name: StringName = "Sc Fit Font Size"

## プラグインの初期化処理を定義します。
## プラグイン (プロジェクト設定ダイアログ>プラグイン>有効) を有効にした直後や、プラグインが有効な状態のプロジェクトを開いた際に呼び出されます。
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"))
	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)
	print("sc_fit_font_size.gd: _exit_tree called")

## メニュー「プロジェクト」→「ツール」→「Sc Fit Font Size」メニューが選択された際に呼び出される関数です。
## 選択中のノード群またはその下位のノード群の Control 派生クラスの
## 表示テキストがコントロールのサイズに合わさるようにフォントサイズを調整します。
func _on_menu_item_sc_fit_font_size():
	# 引数と同等と思われる配列を取得します。詳細は呼び出している関数の説明を参照してください。
	var selected_nodes: Array[Node] = ScUtilEditor.get_editor_plugin_handles_argumnt(self)
	# 選択されているノード群とその下位ノード群の Control 派生ノードを探します。
	var found_nodes: Array[Node] = []
	for selected_node in selected_nodes:
		ScUtil.find_nodes_of_specified_class(selected_node, "Control", found_nodes)
	# 配列の要素を重複しないように変換します。
	var found_unique_nodes: Array = ScUtil.to_unique_array(found_nodes)
	print("found_nodes = ", found_nodes)
	# 探した Control 派生クラスのテキストのフォントサイズを調整します。
	for node in found_unique_nodes:
		var control: Control = node as Control
		if control != null:
			ScUtil.fit_control_font_size(control, ScUtil.get_control_text(control))
		else:
			push_error("_on_menu_item_sc_fit_font_size: Control 派生を探した結果に Control を派生していない Node がありました。")
	return

14 行目で追加したツールメニューでは、 Callable で指定した 27 行目に定義した関数が呼び出されます。
その関数内の 41 行目では、集めた Control クラス(派生含む)のノード1つずつを、フォントサイズを調整する ScUtil.fit_control_font_size 関数(後述のリンク参照)の引数に渡して、テキストがコントロールのサイズにおさまる最大になるようにフォントサイズを調整します。

フォントサイズの自動調整

ボタンなどのコントロールのサイズにあわせてテキストのフォントサイズを調整する ScUtil.fit_control_font_size 関数のスクリプトについては以下の記事を参照してください。

テスト

シーンドックのノードを選択して、追加したツールメニューから選択中のノード群フォントサイズを調整します。
※ Control クラス(派生含む)ではなかったり、テキストを持たない Control クラスは影響を受けません。

単一ノードを選択してフォントサイズ調節

単一ノード(例では Label )を選択してツールメニューを実行します。

Godot4 単一ノードを選択してフォントサイズ調節1

選択したノード(例では Label )のテキストが枠内(例では横幅を超えないように)におさまる最大のフォントサイズに調節されました。

Godot4 単一ノードを選択してフォントサイズ調節2

複数ノードを選択してフォントサイズ調節

複数ノード(例では、例では Button2(Button), CheckButton, LinkButton )を選択してツールメニューを実行します。

Godot4 複数ノードを選択してフォントサイズ調節1

選択したノード群(例では Button2(Button), CheckButton, LinkButton )のテキストが枠内(例では横幅を超えないように)におさまる最大のフォントサイズに調節されました。

Godot4 複数ノードを選択してフォントサイズ調節2

ノードを選択してそれとその子ノード群のフォントサイズ調節

下位ノードを持つ上位ノード(例では、StudyFitFontSize ルートノード (Control) )を選択してツールメニューを実行します。

Godot4 ノードを選択してそれとその子ノード群のフォントサイズ調節1

その選択したノード選択していない下位の全てのノードのテキストが枠内(例では横幅を超えないように)におさまる最大のフォントサイズに調節されました。

Godot4 ノードを選択してそれとその子ノード群のフォントサイズ調節2

以下は、上述の一連のテスト結果の動画です。

まとめ

今回は、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、エディター機能を拡張するプラグインを実装する EditorPlugin クラスを用いて追加したツールメニューアイテム実行した際に、その時点で選択しているノード群を自動的に編集するスクリプト例を紹介しました。

例として Button または Label クラスなどの Control 派生クラスのノードの、テキストのフォントサイズを自動的に調整しました。

参照サイト 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をコピーしました