Godot4 EditorSettings 既定値を指定した設定値の取得の例

無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、EditorSettings の機能を用いて、デフォルトの値を指定して GodotEngine のエディタの設定値をロードして、設定値がない場合はデフォルト値を採用して、辞書変数に取得する実装を紹介します。

EditorInterface の機能は、エディタ上でのみ利用可能なので、シーン実行ではなく新規プラグインから追加したツールメニューを選択することで実行させます。

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

前回の記事

前回は、EditorSettings の機能を用いて、GodotEngine のエディタの設定に保存した設定値をロードして、辞書変数に取得する実装を紹介しました。

前回は、その設定値が存在する場合だけ取得しました。
今回は、デフォルト値を事前に指定することで、設定が存在しない場合もデフォルト値を取得します。

スクリプト例

前回作成したプラグインを構成する gd ファイルを開き、後述するスクリプトを貼り付け保存します。

Godot4 EditorSettings に辞書変数の内容を保存する関数の例4

以下は、貼り付けるスクリプトです。

load_editor_settings_section_to_dictionary 関数以外は、前回の実装と同じです。

EditorInterface.get_editor_settings 関数で取得した EditorSettings クラスのインスタンスを用いて、has_setting メンバ関数で指定した name の設定の存在を確認してから get_setting メンバ関数を用いて、辞書変数にその設定値を格納します。

前回の処理に加えて、追加された引数 default_values 辞書変数のキーと同じ設定値の場合は、設定値が EditorSettings記録されていない場合も、default_values のそのキーに対応する値を戻り値に格納して、デフォルト値を格納できるようにしました

@tool
extends EditorPlugin

## EditorSettings の「ユーザ名/アドオン名/セクション名/キー」の読み書きを Dictionary 型を用いて行う関数とそのテストです。
## EditorInterface の機能はエディタ上で利用できます。
## EditorSettings の機能を含む関数を実行するために、プラグインとしてこのスクリプトを追加して
## ツールメニュー(「プロジェクト」→「ツール」)から、これが追加したメニューを選択してください。
## 
## EditorSettings のファイルは C:\Users\ユーザ名\AppData\Roaming\Godot\editor_settings-4.3.tres にあります。
## 4.3 の部分はバージョンによって変わります。

## メニューアイテムの表示名です。
const tool_menu_item_name: StringName = "Study EditorSettings By Dictionary"

## プラグインの初期化処理を定義します。
## プラグイン (プロジェクト設定ダイアログ>プラグイン>有効) を有効にした直後や、プラグインが有効な状態のプロジェクトを開いた際に呼び出されます。
func _enter_tree():
	# Initialization of the plugin goes here.
	# メニュー「プロジェクト」→「ツール」にサブメニューを追加します。メニュー選択時に、第二引数のメンバ関数を呼び出します。
	add_tool_menu_item(tool_menu_item_name, Callable(self, "_on_menu_item_study_editor_settings_by_dictionary"))
	return


## プラグインの後片付けの処理を定義します。
## プラグインを無効 (プロジェクト設定ダイアログ>プラグイン>有効) にした直後や、プラグインが有効な状態でプロジェクトを閉じた際に呼び出されます。
func _exit_tree():
	# Clean-up of the plugin goes here.
	remove_tool_menu_item(tool_menu_item_name)
	return


## プラグインで追加したツールメニューを選択した際に呼び出される関数です。
func _on_menu_item_study_editor_settings_by_dictionary():
	test_load_editor_settings_section_to_dictionary()
	return


func test_save_editor_settings_section_from_dictionary():
	# 以下の 2 つを組み合わせて、さらにキー名を追加した name で辞書変数の値にアクセスします。
	const EDITOR_SETTINGS_PATH = "sclib/fit_font_size/"
	const EDITOR_SETTINGS_SECTION = "scale_correction_value/"
	
	# セクション内に保存されるデータです。
	var dic_answer = {}
	dic_answer["Label"] = 0.9
	dic_answer["Button"] = 1.0
	
	# 辞書のデータ群を、指定した EditorSettings ファイルのセクションに保存します。
	# ファイルが存在しない場合は作成し、存在する場合は辞書の要素ごとに上書きします。
	print("save_editor_settings_section_from_dictionary call")
	save_editor_settings_section_from_dictionary(
		EDITOR_SETTINGS_PATH, EDITOR_SETTINGS_SECTION, dic_answer)
	
	return


## load_editor_settings_section_to_dictionary のテスト関数です。
func test_load_editor_settings_section_to_dictionary():
	## 以下の 2 つを組み合わせて、さらにキー名を追加した name で辞書変数の値にアクセスします。
	const EDITOR_SETTINGS_PATH = "sclib/fit_font_size/"
	const EDITOR_SETTINGS_SECTION = "scale_correction_value/"
	
	## セクション内に保存されるデータです。
	var dic_save = {}
	dic_save["Label"] = 0.9
	dic_save["Button"] = 1.0
	
	# 辞書のデータ群を、指定した EditorSettings ファイルのセクションに保存します。
	# ファイルが存在しない場合は作成し、存在する場合は辞書の要素ごとに上書きします。
	print("save_editor_settings_section_from_dictionary call")
	save_editor_settings_section_from_dictionary(
		EDITOR_SETTINGS_PATH, EDITOR_SETTINGS_SECTION, dic_save)
	
	# 取得するキーを設定します。
	var key_array = ["Label", "Button", "OptionButton", "CheckButton"]
	
	# デフォルト値を設定します。
	var initial_values := {}
	initial_values["Label"] = 0.5
	initial_values["OptionButton"] = 0.8
	
	# 例では、 CheckButton はセーブしておらず、デフォルト値も指定しません。
	# OptionButton はセーブしていませんが、デフォルト値を指定しています。
	# Button はセーブしていますが、デフォルト値は指定していません。
	# Label はセーブしていて、デフォルト値も指定しています。
	var dic_answer = {}
	dic_answer["Label"] = 0.9
	dic_answer["Button"] = 1.0
	dic_answer["OptionButton"] = 0.8
	#dic_answer["CheckButton"] は、取得されません。
	
	# 指定した EditorSettings ファイルのセクションを読み込み、辞書として取得します。
	print("load_editor_settings_section_to_dictionary call")
	var dic: Dictionary = load_editor_settings_section_to_dictionary(
		EDITOR_SETTINGS_PATH, EDITOR_SETTINGS_SECTION, key_array, initial_values)
	
	# 保存した辞書の内容と、読み込んだ辞書の内容が等しいことを確認します。
	# 異なる場合は警告を出力します。
	if dic != dic_answer:
		push_warning("study_editor_settings_to_dictionary.gd:" +
			"test_load_sample_dictionary:" +
			"dic != dic_answer")
	
	# デバッグ用。読み込んだ辞書の内容を出力します。
	var str_dic: String = ScUtil.to_pretty_print_string(dic)
	print(str_dic)

	return


## 指定した EditorSettings の path (例:「ユーザ名/アドオン名」)のセクションを辞書型で取得します。
## [param path] と [param section] については [method save_editor_settings_section_from_dictionary] を
## 参照してください。
func load_editor_settings_section_to_dictionary(
	path: String, section: String, key_array: Array, default_values: Dictionary = {}
) -> Dictionary:
	var dic := {}
	
	# 設定を保存する name のキーの1つ前までの階層の文字列を作成します。
	var base_path := path + section
	
	# EditorSettings から key_array に指定したキーを base_path に加えた各 name の値を
	# 戻り値の辞書のキーの値として取得します。
	var editor_settings = EditorInterface.get_editor_settings()
	if editor_settings == null:
		push_error("study_eidotr_settings_by_dictionary.gd:" +
			"load_editor_settings_section_to_dictionary:" +
			"editor_settings == null")
		return dic
	
	var default_keys = default_values.keys()
	# 辞書変数の要素ごとに EditorSettings から値を取得します。
	for key in key_array:
		# name の最後には、辞書変数のキーを追加します。
		var editor_settings_name: String = base_path + key
		
		# 本関数内でデフォルト値を設定していない、かつ、name の設定が存在しない場合は警告を出力します。
		# それ以外は、辞書変数に設定値を格納します。
		if editor_settings.has_setting(editor_settings_name) == false:
			if key in default_keys:
				dic[key] = default_values[key]
			else:
				push_warning("study_eidotr_settings_by_dictionary.gd:" +
					"load_editor_settings_section_to_dictionary:" +
					"editor_settings.has_setting(editr_settings_name) == false, " +
					"editor_settings_name = ", editor_settings_name)
		else:
			dic[key] = editor_settings.get_setting(editor_settings_name)
	
	return dic


## 指定した EditorSettings の path (例:「ユーザ名/アドオン名」)のセクションに、辞書型のデータを保存します。
## 辞書の要素のキーは、EditorSettings.set_settings の name 引数、値は value 引数に対応します。
##
## [param path] と [param section] を連結した base_path に、
## 辞書の要素キーを付け加えた name に対して value を設定します。
##
## [param path] に "user_name/addon_name/" を指定して、
## [param section] に "section_name/" を設定すると
## ユーザ名、アドオン名、セクション名を / で区切った後にキーを加えた name に value を設定します。
func save_editor_settings_section_from_dictionary(
	path: String, section: String, dic: Dictionary) -> void:
	
	# 設定を保存する name のキーの1つ前までの階層の文字列を作成します。
	var base_path := path + section
	
	# EditorSettings に dic の各要素を保存します。
	var editor_settings = EditorInterface.get_editor_settings()
	if editor_settings == null:
		push_error("study_eidotr_settings_by_dictionary.gd:" +
			"save_editor_settings_section_from_dictionary:" +
			"editor_settings == null")
		return
	
	# 辞書変数の要素ごとに EditorSettings に保存します。
	for key in dic.keys():
		# name の最後には、辞書変数のキーを追加します。
		var editor_settings_name: String = base_path + key
		editor_settings.set_setting(editor_settings_name, dic[key])
	
	return

処理の流れ

_enter_tree イベント関数で、ツールメニューを追加して、そのメニューの選択時に_on_menu_item_study_editor_settings_by_dictionary 関数を呼び出すように設定しています。

その関数では、test_load_editor_settings_section_to_dictionary テスト関数を呼び出して、2つの項目を EditorSettings から取得する処理を実行します。

テスト関数は、指定されたキーを含む name に対応する設定値を辞書変数に取得する load_editor_settings_section_to_dictionary 関数を呼び出します。

前回の記事で紹介した load_editor_settings_section_to_dictionary の処理に加えた、 default_values 辞書変数のキーと同じ場合は、設定値がない場合にそのキーの値を採用します。

使用した自作関数

ScUtil.to_pretty_print_string 関数については以下の記事を参照してください。
※この関数を使用しなくても、EditorSettings と辞書変数のやりとりは機能します。

テスト

前回追加したツールメニュー「プロジェクト」→「ツール」→「Study EditorSettings By Dictionary」を選択します。

出力ボトムパネルに表示した EditorSettings からロードした値を持つ辞書変数の内容は、事前にセーブした際の辞書変数の内容と同じであることが確認できました。
また、事前にセーブしていない設定値でも、引数で渡したデフォルト値の辞書変数に同じキーがあればそのデフォルト値が戻り値に格納されていることも確認できました。

Godot4 EditorSettings 既定値を指定した設定値の取得の例1

設定値があるものはその値が、ないものはデフォルトの設定値が辞書変数に格納されていることが print 文の出力で確認できました。
また、設定値もデフォルトの値もない場合は警告文が表示されることも確認できました。
※なぜか、print 文の出力の最後の { } の部分は、出力ボトムパネルの右側のインフォメーションのアイコンを2回クリック(非表示に切り替えてからまた表示)しないと表示されませんでした。その後、エディタを再起動して実行するとすぐに表示されました。

  core/variant/variant_utility.cpp:1112 - study_eidotr_settings_by_dictionary.gd:load_editor_settings_section_to_dictionary:editor_settings.has_setting(editr_settings_name) == false, editor_settings_name = sclib/fit_font_size/scale_correction_value/CheckButton
save_editor_settings_section_from_dictionary call
load_editor_settings_section_to_dictionary call
{
	"Label": 0.9,
	"Button": 1,
	"OptionButton": 0.8
}

まとめ

  • EditorInterfaceEditorSettings などの機能は、シーン実行時は利用できないため、ツールメニューを選択して実行しました。
  • 前回の EditorSettings の値を辞書で取得する関数に、デフォルト値を指定する辞書変数を引数に追加して、設定値がない場合でもデフォルト値のキーと一致する場合はデフォルト値戻り値の辞書変数に格納する実装例テストしました。

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