Godot4 プロジェクト設定に保存した独自の項目の初期値設定プラグイン実装例

無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、プロジェクトごとの設定を管理するプロジェクト設定から、指定した項目(前に追加した独自項目)の初期値設定するスクリプト例と実行結果を紹介します。

初期値を指定していない状態でなぜか「初期値に戻す」ボタンが表示されていて、それを使用した際の警告などについても紹介します。
※Revert や「元に戻す」ボタンの方が適切かもしれませんが、本記事では、初期値に戻すボタンを「初期値に戻す」ボタンと呼称します。

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

プラグインによるツールメニューとサブメニューの追加

独自の項目をプロジェクト設定に保存する処理を実装した関数は、作成したプラグインによって追加したツールメニューのサブメニューを選択することで呼び出されます。

プラグインとツールメニュー・サブメニューの追加の方法については以下の記事を参照してください。

独自項目を保存するサブメニュー Save について

独自項目を保存するサブメニュー Save については以下の記事を参照してください。

独自項目を削除するサブメニュー Clear について

独自項目を削除するサブメニュー Clear については以下の記事を参照してください。

初期値を設定する前のプロジェクト設定ダイアログ

サブメニュー Clear で独自項目を削除した後、サブメニュー Save で独自項目を保存します。
この状態では、保存した独自項目には初期値が設定されていません

Godot4 プロジェクト設定に保存した独自の項目の初期値設定プラグイン実装例1
_on_submenu_id_pressed called. id = 3
Clear pressed.
erase_project_settings_section_from_dictionary call
erase_project_settings_section_from_dictionary, project_settings_name = sclib/fit_font_size/scale_correction_value/Label
sclib/fit_font_size/scale_correction_value/Label を ProjectSettings から削除しました。
erase_project_settings_section_from_dictionary, project_settings_name = sclib/fit_font_size/scale_correction_value/Button
sclib/fit_font_size/scale_correction_value/Button を ProjectSettings から削除しました。
_on_submenu_id_pressed called. id = 0
Save pressed.
save_project_settings_section_from_dictionary call

メニュー「プロジェクト」→「プロジェクト設定」から、プロジェクト設定ダイアログの一般タブを開いて、右上の「高度な設定」を有効にして、左側のツリーの下側を確認すると、保存した独自項目のセクションと項目値(例:ラベル、Button)が表示されています。
※日本語対応の影響なのか Label と設定していても表示はラベルになっています。

Godot4 プロジェクト設定に保存した独自の項目の初期値設定プラグイン実装例2

初期値を設定していない状態でも、Revert ボタンを押せますが、値は 0 になり、出力ボトムパネルには警告文が表示されました。

Godot4 プロジェクト設定に保存した独自の項目の初期値設定プラグイン実装例3
Godot4 プロジェクト設定に保存した独自の項目の初期値設定プラグイン実装例4
scale_correction_value/Label を設定
  core/config/project_settings.cpp:351 - Property not found: sclib/fit_font_size/scale_correction_value/Label
  core/config/project_settings.cpp:351 - Property not found: sclib/fit_font_size/scale_correction_value/Label
  core/config/project_settings.cpp:351 - Property not found: sclib/fit_font_size/scale_correction_value/Label
  core/config/project_settings.cpp:351 - Property not found: sclib/fit_font_size/scale_correction_value/Label
  core/config/project_settings.cpp:351 - Property not found: sclib/fit_font_size/scale_correction_value/Label
scale_correction_value/Button を設定
  core/config/project_settings.cpp:351 - Property not found: sclib/fit_font_size/scale_correction_value/Button
  core/config/project_settings.cpp:351 - Property not found: sclib/fit_font_size/scale_correction_value/Button
  core/config/project_settings.cpp:351 - Property not found: sclib/fit_font_size/scale_correction_value/Button
  core/config/project_settings.cpp:351 - Property not found: sclib/fit_font_size/scale_correction_value/Button
  core/config/project_settings.cpp:351 - Property not found: sclib/fit_font_size/scale_correction_value/Button

このあと、プロジェクト設定ダイアログを再度確認すると、保存した独自項目が消されています。

Godot4 プロジェクト設定に保存した独自の項目の初期値設定プラグイン実装例6

独自項目が消えた状態で、後述するスクリプトに追加した、初期値を設定するサブメニュー Set Initial Value を選択して関数を実行しても、項目が見つからず初期値を設定する処理が行われません。

Godot4 プロジェクト設定に保存した独自の項目の初期値設定プラグイン実装例5
_on_submenu_id_pressed called. id = 1
Set Initial Value pressed.
set_editor_settings_section_initial_value_from_dictionary call
set_initial_values, project_settings_name = sclib/fit_font_size/scale_correction_value/Label
set_initial_value project_settings_name = sclib/fit_font_size/scale_correction_value/Label は存在しません。 
set_initial_values, project_settings_name = sclib/fit_font_size/scale_correction_value/Button
set_initial_value project_settings_name = sclib/fit_font_size/scale_correction_value/Button は存在しません。

そこで、再び、サブメニュー Save を選択して、独自項目を保存しました。

Godot4 プロジェクト設定に保存した独自の項目の初期値設定プラグイン実装例7
_on_submenu_id_pressed called. id = 0
Save pressed.
save_project_settings_section_from_dictionary call
Godot4 プロジェクト設定に保存した独自の項目の初期値設定プラグイン実装例8

プロジェクト設定の項目の初期値を設定するスクリプト例

以下のスクリプトを、以下の記事で作成したプラグインの gd スクリプトに貼り付けて保存します。

上記の記事で紹介している手順で、追加したツールメニューのサブメニューを選択すると、_on_submenu_id_pressed 関数( 57 行目)が呼び出され、サブメニューのどの項目かを id で判別して、対応する関数を呼び出します。

@tool
extends EditorPlugin

## ProjectSettings の「ユーザ名/アドオン名/セクション名/キー」の読み書きを Dictionary 型を用いて行う関数とそのテストです。
## EditorInterface の機能はエディタ上で利用できます。
## ProjectSettings の機能を含む関数を実行するために、プラグインとしてこのスクリプトを追加して
## ツールメニュー(「プロジェクト」→「ツール」)から、これが追加したメニューを選択してください。

## 追加するメニューアイテムの表示名です。
const tool_menu_item_name: StringName = "Study ProjectSettings By Dictionary"
## メニューアイテムに追加するサブメニューアイテムの項目名と ID の配列です。
const tool_submenu_item_info_array = [
	{"name": "Save", "id": 0},
	{"name": "Set Initial Value", "id": 1},
	{"name": "Load", "id": 2},
	{"name": "Clear", "id": 3},
]
## サブメニューのリソースです。
var submenu: PopupMenu = null

## テストでアクセスする ProjectSettings の name の要素です。
## テストでは、 EDITOR_SETTINGS_PATH + EDITOR_SETTINGS_SECTION + key を name とします。
const PROJECT_SETTINGS_PATH = "sclib/fit_font_size/"
const PROJECT_SETTINGS_SECTION = "scale_correction_value/"


## プラグインの初期化処理を定義します。
## プラグイン (プロジェクト設定ダイアログ>プラグイン>有効) を有効にした直後や、プラグインが有効な状態のプロジェクトを開いた際に呼び出されます。
func _enter_tree():
	if submenu == null:
		# サブメニュー用のポップアップメニューに項目名とその ID を追加します。
		submenu = PopupMenu.new()
		for info in tool_submenu_item_info_array:
			submenu.add_item(info.name, info.id)
		# 選択されたシグナル発生時に呼び出す関数を設定します。
		submenu.id_pressed.connect(_on_submenu_id_pressed)
		# ツールメニュー(「プロジェクト」→「ツール」)にメニューアイテムとそのサブメニューを追加します。
		add_tool_submenu_item(tool_menu_item_name, submenu)
	
	return


## プラグインの後片付けの処理を定義します。
## プラグインを無効 (プロジェクト設定ダイアログ>プラグイン>有効) にした直後や、プラグインが有効な状態でプロジェクトを閉じた際に呼び出されます。
func _exit_tree():
	# ツールメニュー(「プロジェクト」→「ツール」)に追加したメニューアイテムを削除します。
	remove_tool_menu_item(tool_menu_item_name)
	# サブメニューのリソースを解放します。
	if submenu != null:
		submenu.queue_free()
		submenu = null
	return


## プラグインで追加したツールメニューのサブメニューを選択した際に呼び出される関数です。
## [param id] は、選択されたサブメニューの項目の ID です。
func _on_submenu_id_pressed(id):
	print("_on_submenu_id_pressed called. id = ", id)
	print(tool_submenu_item_info_array[id].name, " pressed.")
	
	# id が指すツールメニューのサブメニューに対応した処理を実行します。
	match id:
		0:	# Save
			test_save_editor_settings_section_from_dictionary()
		1:	# Set Initial Value
			test_set_editor_settings_section_initial_value_from_dictionary()
		3:	# Clear
			test_erase_project_settings_section_from_dictionary()
		_:
			push_warning("id is unknown.")
	return

## [method save_project_settings_section_from_dictionary] のテスト関数です。
func test_save_editor_settings_section_from_dictionary():
	# セクション内に保存されるデータです。
	var dic_save = {}
	dic_save["Label"] = 0.9
	dic_save["Button"] = 1.0
	
	# 辞書のデータ群を、指定した EditorSettings ファイルのセクションに保存します。
	# ファイルが存在しない場合は作成し、存在する場合は辞書の要素ごとに上書きします。
	print("save_project_settings_section_from_dictionary call")
	save_project_settings_section_from_dictionary(
		PROJECT_SETTINGS_PATH, PROJECT_SETTINGS_SECTION, dic_save)
	
	return


## 指定した ProjectSettings の 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_project_settings_section_from_dictionary(
	path: String, section: String, dic: Dictionary) -> void:
	
	# 設定を保存する name のキーの1つ前までの階層の文字列を作成します。
	var base_path := path + section
	
	# 辞書変数の要素ごとに EditorSettings に保存します。
	for key in dic.keys():
		# name の最後には、辞書変数のキーを追加します。
		var project_settings_name: String = base_path + key
		ProjectSettings.set_setting(project_settings_name, dic[key])
	
	return


func test_erase_project_settings_section_from_dictionary():
	# セクション内に保存されるデータです。
	var array_erase_keys = ["Label", "Button"]
	
	# 辞書のデータ群を、指定した EditorSettings ファイルのセクションの
	# 各設定値の初期値に設定します。
	print("erase_project_settings_section_from_dictionary call")
	erase_project_settings_section_from_dictionary(
		PROJECT_SETTINGS_PATH, PROJECT_SETTINGS_SECTION, array_erase_keys)
	
	return


## ProjectSettings の項目を削除します。
## 削除することでエディタが正常に動作しなくなる危険性があるので注意してください。
## [param path] + [param section ] + [param erase_keys] の各要素で連結した文字列
## の name に一致する項目を削除します。
func erase_project_settings_section_from_dictionary(
	path: String, section: String, erase_keys: Array = []
) -> void:
	
	# 設定を保存する name のキーの1つ前までの階層の文字列を作成します。
	var base_path := path + section
	
	# 辞書変数の要素ごとに EditorSettings から値を取得します。
	for key in erase_keys:
		# name の最後には、辞書変数のキーを追加します。
		var project_settings_name: String = base_path + key
		print("erase_project_settings_section_from_dictionary, project_settings_name = ", project_settings_name)
		# name と同じ項目があれば、それを削除します。
		if ProjectSettings.has_setting(project_settings_name) == true:
			# 指定した name の設定値を削除します。
			ProjectSettings.set_setting(project_settings_name, null)
			print(project_settings_name, " を ProjectSettings から削除しました。")
		else:
			print(project_settings_name, " は ProjectSettings にありませんでした。")
	return


## [method set_editor_settings_section_initial_value_from_dictionary] のテスト関数です。
func test_set_editor_settings_section_initial_value_from_dictionary():
	# セクション内に保存されるデータです。
	var dic_initial = {}
	dic_initial["Label"] = 0.98
	dic_initial["Button"] = 0.95
	
	# 辞書のデータ群を、指定した EditorSettings ファイルのセクションの
	# 各設定値の初期値に設定します。
	print("set_editor_settings_section_initial_value_from_dictionary call")
	set_editor_settings_section_initial_value_from_dictionary(
		PROJECT_SETTINGS_PATH, PROJECT_SETTINGS_SECTION, dic_initial)
	
	return


## ProjectSettings の項目の初期値を指定します。
## これは ProjectSettings の Revert ボタンが押されたときなどに用いられます。
## 存在しない項目については処理しません。
func set_editor_settings_section_initial_value_from_dictionary(
	path: String, section: String, initial_values: Dictionary = {}
) -> void:
	
	# 設定を保存する name のキーの1つ前までの階層の文字列を作成します。
	var base_path := path + section
	
	# 辞書変数の要素ごとに EditorSettings から値を取得します。
	for key in initial_values.keys():
		# name の最後には、辞書変数のキーを追加します。
		var project_settings_name: String = base_path + key
		print("set_initial_values, project_settings_name = ", project_settings_name)
		if ProjectSettings.has_setting(project_settings_name) == true:
			# 初期値を設定します。
			ProjectSettings.set_initial_value(project_settings_name, initial_values[key])
			print("set_initial_value project_settings_name = ", project_settings_name, 
			", initial_value = ", initial_values[key])
		else:
			print("set_initial_value project_settings_name = ", project_settings_name, 
			" は存在しません。 ")
	
	return

今回は、サブメニュー Set Initial Value を選択した際に、プロジェクト設定に独自の項目を保存するテスト関数 test_set_editor_settings_section_initial_value_from_dictionary( 153 行目)を呼び出します。

そのテスト関数の内部では、辞書変数に指定した項目群をプロジェクト設定保存する set_editor_settings_section_initial_value_from_dictionary 関数( 171 行目)を呼び出します。

その関数内で、初期値を設定する項目存在することを has_setting 関数で確認した後に、 辞書の要素ごとに set_initial_value 関数を使用( 185 行目)して、プロジェクト設定に保存した独自の項目に初期値を設定しています。

bool has_setting(name: String) const 

Returns true if a configuration value is present.

構成値が存在する場合は true を返します。

Note: In order to be be detected, custom settings have to be either defined with set_setting(), or exist in the project.godot file. This is especially relevant when using set_initial_value().

注: 検出されるためには、カスタム設定が set_setting() で定義されているか、project.godot ファイルに存在している必要があります。これは、set_initial_value() を使用する場合に特に関係します。

ProjectSettings — Godot Engine (stable) documentation in English #has_setting と Google 翻訳

void set_initial_value(name: String, value: Variant

Sets the specified setting’s initial value. This is the value the setting reverts to. The setting should already exist before calling this method. Note that project settings equal to their default value are not saved, so your code needs to account for that.

指定された設定の初期値を設定します。これは、設定が戻る値です。この設定は、このメソッドを呼び出す前にすでに存在している必要があります。デフォルト値と等しいプロジェクト設定は保存されないため、コードでそれを考慮する必要があることに注意してください。

extends EditorPlugin

const SETTING_NAME = "addons/my_setting"
const SETTING_DEFAULT = 10.0

func _enter_tree():
	if not ProjectSettings.has_setting(SETTING_NAME):
		ProjectSettings.set_setting(SETTING_NAME, SETTING_DEFAULT)

	ProjectSettings.set_initial_value(SETTING_NAME, SETTING_DEFAULT)

If you have a project setting defined by an EditorPlugin, but want to use it in a running project, you will need a similar code at runtime.

EditorPlugin によって定義されたプロジェクト設定があるが、それを実行中のプロジェクトで使用したい場合は、実行時に同様のコードが必要になります。

ProjectSettings — Godot Engine (stable) documentation in English #set_initial_value と Google 翻訳

設定した初期値をプロジェクト設定ダイアログで確認

独自項目がプロジェクト設定に保存されている状態で、Set Initial Value サブメニューを選択して、初期値を設定します。

Godot4 プロジェクト設定に保存した独自の項目の初期値設定プラグイン実装例9
_on_submenu_id_pressed called. id = 1
Set Initial Value pressed.
set_editor_settings_section_initial_value_from_dictionary call
set_initial_values, project_settings_name = sclib/fit_font_size/scale_correction_value/Label
set_initial_value project_settings_name = sclib/fit_font_size/scale_correction_value/Label, initial_value = 0.98
set_initial_values, project_settings_name = sclib/fit_font_size/scale_correction_value/Button
set_initial_value project_settings_name = sclib/fit_font_size/scale_correction_value/Button, initial_value = 0.95

初期値を設定した状態で「初期値に戻す」ボタンを押すと、指定した値がそれぞれ設定されました。

Godot4 プロジェクト設定に保存した独自の項目の初期値設定プラグイン実装例10
	var dic_initial = {}
	dic_initial["Label"] = 0.98
	dic_initial["Button"] = 0.95
Godot4 プロジェクト設定に保存した独自の項目の初期値設定プラグイン実装例11
scale_correction_value/Label を設定
scale_correction_value/Button を設定

まとめ

  • ProjectSettings クラスの set_initial_value 関数を使用して、プロジェクト設定の、指定した項目(独自の項目)に初期値を設定しました。
  • プロジェクト設定ダイアログで、「初期値に戻す」(Revert) ボタンを押して、指定した項目の値が初期値戻ることを確認しました。

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